JNA加载库

| 我有两个库,一个带有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中有什么方法可以使它起作用? *编辑示例编译*
gcc -c -fPIC -g -O0 -fstack-check -pipe -gnatE -gnatU -gnatwl -gnatf -gnatE -gnat05 -lIPCC -I- -gnatA <<my directory>>src/ndds_c.adb
    
已邀请:
交叉链接将在本机代码域而不是Java内部发生。据JNA所知,它正在加载两个完全独立的本机库。 您需要为库本身提供彼此的位置。有两种方法可以做到这一点。在编译共享库时设置rpath,或者在运行时设置LD_LIBRARY_PATH环境变量。 Rpath可以说是更好的方法,因为它特定于需要它的二进制文件,并且不会污染运行时环境。您可以使用以下编译器标志在gcc中进行设置:
-Lpath-to-your-library -Wl,-rpath,path-to-your-library
    
您是否将所有本机关键字都放在一个\'CLibrary \'中?因此,当它执行第一个Native.loadLibrary时,它将尝试将所有符号从第一次加载映射到所有本机定义的方法。 尝试将其分解为CLibrary1和CLibrary2,它们与Ada和C库将加载的符号完全对应。我相信Java将尝试映射所有本机方法,并且在第一个Native.loadLibrary中缺少的一半上将失败。
CLibrary INSTANCE9 = (CLibrary)
Native.loadLibrary(\"IPCC\", //  <<< our library goes here
                  CLibrary.class);

AdaLibrary INSTANCE8 = (AdaLibrary)
Native.loadLibrary(\"IPCAda\", //  <<< our library goes here
                  AdaLibrary.class);
您还提到了C ++。 Java JNI无法加载C ++损坏的符号。如果您可能强迫实现将其导出为C符号,则可以。在谈论本机实现时,请不要交换C和C ++。     

要回复问题请先登录注册