- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我有一个 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/
我是一名优秀的程序员,十分优秀!