java - 程序部署后 JNI 找不到共享库
问题描述
将导出的 Java 项目从开发机器移到生产机器后,我遇到了麻烦。
java项目(一个Eclipse插件)有一个我写的JNI库,它依赖于一个开源库,而开源库又依赖于Boost。我在我的 SLES11 机器上编译了包括 Boost 在内的所有内容,并且该程序正常运行。
当我将程序移动到另一台机器时,我收到错误:
java.lang.UnsatisfiedLinkError:/path/to/project/lib/libMyJNI.so: libboost_system.so.1.67.0: cannot open shared object file: No such file or directory
我在同一目录中复制了所需的库。
ldd libMyJNI.so
列出了 20 个依赖项,但解决了所有这些依赖项。
我仍然得到同样的错误。
我假设java.library.path
设置正确,因为它会尝试加载libMyJNI.so
和识别依赖项。
我是否期望如果ldd
有效,java应该解决依赖关系?有什么线索吗?
谢谢!
编辑:这是 ldd 的输出ldd libMyJNI.so
linux-vdso.so.1 => (0x00007fffa59ff000)
libboost_system.so.1.67.0 (0x00007fc427bce000)
libboost_filesystem.so.1.67.0 (0x00007fc4279b4000)
libboost_thread.so.1.67.0 (0x00007fc42778f000)
libboost_date_time.so.1.67.0 (0x00007fc42757a000)
libboost_iostreams.so.1.67.0 (0x00007fc42735f000)
libboost_serialization.so.1.67.0 (0x00007fc42710f000)
libboost_chrono.so.1.67.0 (0x00007fc426f06000)
libboost_atomic.so.1.67.0 (0x00007fc426d04000)
libboost_regex.so.1.67.0 (0x00007fc426a00000)
libpcl_common.so.1.8 (0x00007fc42673b000)
libpcl_io.so.1.8 (0x00007fc4263cb000)
libpcl_octree.so.1.8 (0x00007fc425fdc000)
libstdc++.so.6 => /usr/lib64/libstdc++.so.6 (0x00007fc425c98000)
libm.so.6 => /lib64/libm.so.6 (0x00007fc425a42000)
libgcc_s.so.1 => /lib64/libgcc_s.so.1 (0x00007fc42582b000)
libc.so.6 => /lib64/libc.so.6 (0x00007fc4254cc000)
librt.so.1 => /lib64/librt.so.1 (0x00007fc4252c3000)
libpthread.so.0 => /lib64/libpthread.so.0 (0x00007fc4250a6000)
libz.so.1 => /lib64/libz.so.1 (0x00007fc424e8f000)
libgomp.so.1 => /usr/lib64/libgomp.so.1 (0x00007fc424c86000)
libpcl_io_ply.so.1.8 (0x00007fc424a21000)
libpng12.so.0 => /usr/lib64/libpng12.so.0 (0x00007fc4247f9000)
/lib64/ld-linux-x86-64.so.2 (0x00007fc427fe8000)
解决方案
感谢@user2543253,我已经解决了这个问题。我正在为将来的读者提供答案(包括我,当我遇到同样的问题时)。
java.library.path
设置正确,因为它可以加载 JNI 库。其他库(依赖项)必须位于LD_LIBRARY_PATH
. 因此,在部署软件时,您可以
- 将依赖项安装在通常存在的位置
LD_LIBRARY_PATH
或 LD_LIBRARY_PATH
在启动插件之前附加一个目录。
ldd
可以成功链接库,因为它也在当前目录中查找。所以ldd libMyJNI.so
可能成功,ldd \path\to\libMyJNI.so
也可能失败。在这种情况下,JNI 将不起作用。
推荐阅读
- javascript - 如何在悬停到单个元素时选择多个元素
- xcode - 可以在 iOS 应用程序中支持(部分)本地化而不在应用商店中出现本地化吗?
- javascript - Javascript - 将录制的音频流式传输为麦克风输入
- android - 我的表单键没有在颤振中验证,即使在我将它用作表单中的键并输入合适的值之后
- android - 如何根据条件在 recyclerView 中隐藏子项?
- amazon-s3 - hadoop fs -ls s3://bucket 或 s3a://bucket 抛出“没有这样的文件或目录”错误
- linux - 在 openscap 中修复后反转规则
- java - 设置拥有方ID
- php - Laravel 8 Blade:语法错误,文件意外结束,期待 elseif (T_ELSEIF) 或 else (T_ELSE) 或 endif (T_ENDIF)
- django - django 模型,NOT NULL 约束在foreignKey 上失败,即使很难我把 null=True 放在我的模型类中