use*_*005 8 java shared-libraries jna
我使用JNA用Java包装共享库(用C语言编写).共享库是内部编写的,但该库使用来自另一个外部库的函数,这又取决于另一个外部库.所以情况是这样的:
ext1 < - ext2 < - 内部
即内部使用外部库ext2,它再次使用外部库ext1.我试过的是:
System.loadLibrary("ext1");
System.loadLibrary("ext2");
NativeLIbrary.loadLibrary("internal",xxx.class);
Run Code Online (Sandbox Code Playgroud)
加载库"ext2"时,此方法失败并显示"UnresolvedException"; 链接器抱怨存在于库"ext1"中的符号.所以它认为System.loadLibrary()函数不会使"ext1"中的符号全局可用?当使用stdlib函数dlopen()时:
handle = dlopen( lib_name , RTLD_GLOBAL );
Run Code Online (Sandbox Code Playgroud)
在@lib_name中找到的所有符号都可用于后续加载中的符号解析; 我想我喜欢的东西类似于java品种System.loadLibrary()?
问候 - Joakim Hove
这是一个老问题,但我找到了一个可以接受的解决方案,它也应该是可移植的,我想我应该发布一个答案。解决方案是使用JNA的NativeLibrary#getInstance(),因为在 Linux 上这将传递RTLD_GLOBAL给dlopen()(而在 Windows 上则不需要)。
现在,如果你使用这个库来实现一个Javanative方法,您还需要调用System.load()(或Sysem.loadLibrary())在同一个库,打完电话后NativeLibrary#getInstance()。
首先,一个指向 JNA 错误的链接:JNA-61
那里的一条评论说,基本上应该在 JNA 中使用实际库之前加载依赖项,而不是标准的 Java 方式。我只是复制粘贴我的代码,这是一个典型的场景:
String libPath =
"/path/to/my/lib:" + // My library file
"/usr/local/lib:" + // Libraries lept and tesseract
System.getProperty("java.library.path");
System.setProperty("jna.library.path", libPath);
NativeLibrary.getInstance("lept");
NativeLibrary.getInstance("tesseract");
OcrTesseractInterf ocrInstance = (OcrTesseractInterf)
Native.loadLibrary(OcrTesseractInterf.JNA_LIBRARY_NAME, OcrTesseractInterf.class);
Run Code Online (Sandbox Code Playgroud)
我编写了一个小型库,使用 Tesseract 为我的 Java 应用程序提供 OCR 功能。Tesseract 依赖于 Leptonica,所以要使用我的库,我需要先加载库lept和tesseract。使用标准方法(System.load() 和 System.loadLibrary())加载库并不能解决问题,设置属性jna.library.path或java.library.path也不行。显然,JNA 喜欢以自己的方式加载库。
这在 Linux 中对我有用,我想如果设置了正确的库路径,这也应该适用于其他操作系统。
好的;
我最终找到了一个可以接受的解决方案,但并非没有大量的限制。我所做的是
它实际上似乎有效:-)
| 归档时间: |
|
| 查看次数: |
6111 次 |
| 最近记录: |