程序部署后,JNI找不到共享库

时间:2018-06-29 09:13:44

标签: java boost java-native-interface sles

将导出的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)

1 个答案:

答案 0 :(得分:0)

感谢@ user2543253我已经解决了这个问题。我会在将来为读者提供答案(包括我,当我遇到同样的问题时)。

java.library.path的设置正确,因为它可以加载JNI库。其他库(依赖项)必须位于LD_LIBRARY_PATH中列出的目录中。因此,在部署软件时,您可以

  • 将依赖项安装在LD_LIBRARY_PATH
  • 中通常存在的位置
  • 在启动插件之前,将目录追加到LD_LIBRARY_PATH

ldd可能会成功链接库,因为它也会出现在当前目录中。因此ldd libMyJNI.so可能会成功,而ldd \path\to\libMyJNI.so可能会失败。在这种情况下,JNI将无法正常工作。