java - 如何在 linux 中调试 java system.loadlibrary 错误?

标签 java eclipse java-native-interface

我有一个 Java 程序,它通过 JNI 调用我试图在 Linux 上运行的 C 代码。外部代码由两个 .so 文件组成:一个用于 JNI 绑定(bind)(使用 swig 构建),另一个具有实际功能。我在同一目录中有两个库,并且 LD_LIBRARY_PATH 设置正确。从命令行运行时 ldd 报告没有问题,但是当我在 Eclipse 编辑器的“运行配置”对话框中将 LD_LIBRARY_PATH 设置为相同的值并尝试执行该程序时,出现以下错误:

java.lang.UnsatisfiedLinkError: [path to libraries]/[JNI binding library].so: [actual code library].so: cannot open shared object file: No such file or directory

这让我相信 JNI 包装器库已成功加载,但当该库尝试加载包含实际代码的库时却失败了。有什么办法可以进一步调试吗?

我会进一步指出,这个问题发生在 eclipse 编辑器本身,而且我没有尝试将代码打包到 jar 中并在独立的 jvm 实例中运行它。

最佳答案

我认为问题在于调用 System.loadLibrary(String) 和使用 LD_LIBRARY_PATH。使用 loadLibrary("foo") 将在您的 java.library.path 中查找名为 libfoo.so 的内容。如果没有找到任何名为 libfoo.so 的内容,您将收到此错误。

现在,如果您只设置 LD_LIBRARY_PATH,链接器将自动获取您想要的 native 符号,因此您无需设置 -Djava.library.path。

根据我在 gdal 项目中使用 swig 的经验,这个错误实际上是无害的,并且由于设置了 LD_LIBRARY_PATH,这将正常工作。

我建议使用 -Djava.library.path 并显式调用 loadLibrary,原因是如果您决定使用 webstart 部署您的应用程序,您将明确需要调用 loadLibrary 来获取您的原生库。

当我使用 eclipse 时,我遵循 Daff 给出的说明,您可以在 Build Path 的 Libraries 选项卡中编辑 jar 下的本地库。再次提一下,这只是在幕后设置了 java.library.path。

关于java - 如何在 linux 中调试 java system.loadlibrary 错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1010503/

相关文章:

java -++ 运算符对整数有什么作用?

java - 在Java中如何使溢出文本转到下一行

java - 如何从 String 传递 setColor 参数

eclipse - GWT + Maven + 执行错误(org.bsc.maven :maven-processor-plugin:2. 0.5:process:process:generate-sources)

java - Eclipse 中的错误-找不到主类

java - 修改rt.jar可以吗?

java - 为什么在java中加载JNI是在静态初始化程序中完成的?

java - 当构造函数在抛出异常之前部分成功时会发生什么?

java - 如何在 Eclipse 中快速实现/覆盖方法?

android - JNI 错误(应用程序错误): attempt to use stale Local 0x31 (should be 0x39)