【发布时间】:2011-09-02 00:25:49
【问题描述】:
我有两个库,一个带有 Ada 对象,一个带有 C++ 对象(我没有太多控制权)
Ada 的东西引用了 C 的东西,反之亦然...
这个符号在 libIPCAda.so 中:ipc_manager_shutdown_c
这个符号在 libIPCC.so 中:stream_buffer_header_size
当我进行这些 JNA 调用时:
CLibrary INSTANCE8 = (CLibrary)
Native.loadLibrary("IPCAda", // <<< our library goes here
CLibrary.class);
CLibrary INSTANCE9 = (CLibrary)
Native.loadLibrary("IPCC", // <<< our library goes here
CLibrary.class);
我明白了:
ld.so.1: java: fatal: relocation error: file <<my directory>>/lib/libIPCAda.so: symbol stream_buffer_header_size: referenced symbol not found
当我进行这些 JNA 调用时:
CLibrary INSTANCE9 = (CLibrary)
Native.loadLibrary("IPCC", // <<< our library goes here
CLibrary.class);
CLibrary INSTANCE8 = (CLibrary)
Native.loadLibrary("IPCAda", // <<< our library goes here
CLibrary.class);
我明白了:
Exception in thread "main" java.lang.UnsatisfiedLinkError: Unable to load library 'IPCC': ld.so.1: java: fatal: relocation error: file <<my directory>>/lib/libIPCC.so: symbol ipc_manager_shutdown_c: referenced symbol not found
at com.sun.jna.NativeLibrary.loadLibrary(NativeLibrary.java:163)
at com.sun.jna.NativeLibrary.getInstance(NativeLibrary.java:236)
at com.sun.jna.Library$Handler.<init>(Library.java:140)
at com.sun.jna.Native.loadLibrary(Native.java:379)
at com.sun.jna.Native.loadLibrary(Native.java:364)
at Test2$CLibrary.<clinit>(Test2.java:55)
at Test2.main(Test2.java:74)
显然它不喜欢交叉依赖符号...有什么办法可以在 JNA 中实现这一点?
*EDIT 示例编译 *
gcc -c -fPIC -g -O0 -fstack-check -pipe -gnatE -gnatU -gnatwl -gnatf -gnatE -gnat05 -lIPCC -I- -gnatA <<my directory>>src/ndds_c.adb
【问题讨论】:
标签: java c++ java-native-interface shared-libraries jna