java - JNA 加载库

标签 java c++ java-native-interface shared-libraries 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 所知,它正在加载两个完全独立的 native 库。

您需要为图书馆本身提供彼此的位置。有几种方法可以做到这一点;要么在编译共享库时设置 rpath,要么在运行时设置 LD_LIBRARY_PATH 环境变量。

Rpath 可以说是更好的方法,因为它特定于需要它的二进制文件,并且不会污染运行时环境。您可以使用以下编译器标志在 gcc 中设置它:

-Lpath-to-your-library -Wl,-rpath,path-to-your-library

关于java - JNA 加载库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6129165/

相关文章:

java - 在 Java 中使用正则表达式解析 HTTP XML 响应

java - Netty Comet 异步请求超时

java - 我的 Eclipse 环境无法浏览我的项目

c++ - 使用退格控制字符删除

c++ - boost::condition 会 boost 性能吗?

C++模板参数类型推断

java - 如何在 Java 中声明类型化类?

android - 什么是 Android JNI 应用程序上下文中的模块?

c++ - 如何拥有可被多种语言调用的 C++ 库?

java - JNI : Does C++ calls Java asynchronous?