gpt4 book ai didi

Java:加载具有依赖项的共享库

转载 作者:塔克拉玛干 更新时间:2023-11-03 04:21:20 26 4
gpt4 key购买 nike

我正在使用 JNA 用 Ja​​va 包装一个共享库(用 C 编写)。共享库是在内部编写的,但是该库使用来自另一个外部库的函数,这又依赖于另一个外部库。所以情况是这样的:

ext1 <- ext2 <- 内部

即内部使用外部库 ext2,它再次使用外部库 ext1。我尝试过的是:

System.loadLibrary("ext1");
System.loadLibrary("ext2");
NativeLIbrary.loadLibrary("internal",xxx.class);

加载库“ext2”时,此方法失败并出现“UnresolvedException”;链接器提示库“ext1”中确实存在的符号。因此,似乎 System.loadLibrary() 函数不会使“ext1”中的符号全局可用?当使用 stdlib 函数 dlopen() 时:

handle = dlopen( lib_name , RTLD_GLOBAL );

在@lib_name 中找到的所有符号将可用于后续加载中的符号解析;我想我想要的是与 java 变体 System.loadLibrary() 类似的东西?

问候 - Joakim Hove

最佳答案

这是一个老问题,但我找到了一个可以接受的解决方案,它也应该是可移植的,我想我应该发布一个答案。解决方案是使用 JNANativeLibrary#getInstance() ,因为在 Linux 上这会将 RTLD_GLOBAL 传递给 dlopen()(在 Windows 上则不需要)。

现在,如果您使用此库来实现 Java native 方法,您还需要调用 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);

我编写了一个小型库,使用 Tesseract 为我的 Java 应用程序提供 OCR 功能。 Tesseract 依赖于 Leptonica,因此要使用我的库,我需要先加载库 lepttesseract。使用标准方法(System.load() 和 System.loadLibrary())加载库并不能解决问题,设置属性 jna.library.pathjava.library 也没有用.路径。显然,JNA 喜欢以自己的方式加载库。

这对我来说适用于 Linux,我想如果设置了正确的库路径,它也应该适用于其他操作系统。

关于Java:加载具有依赖项的共享库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5425034/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com