簡體   English   中英

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

[英]JNI can't find shared library after program has been deployed

將導出的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將無法工作。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM