從通過JNI加載的共享庫中調用的dlopen使得先前加載符號具有與使用JNI本機代碼交互的Java應用程序。本機代碼在運行時編譯文件,並嘗試使用dlopen調用加載此文件。此調用失敗,我得到一個警告,指出隱形
Could not load library (x):(x) undefined symbol: y
然而,當我有開始通過JNI一個JVM上運行相同的代碼的本地應用程序,則不會出現此錯誤,它運行正常。我懷疑Java正在做的事情看中這將導致已經加載庫是裝載有的dlopen庫中不可見。
這是我沒有診斷問題:
- 其中共享庫,假想未定義使用
objdump
- 位於確認這庫是通過使用
gdb
加載的符號確認(通過蝕 - 庫被列在模塊窗格中) - 在dlopen之前打印LD_LIBRARY_PATH並確認Java將它傳遞過來(它確實添加了Java的lib目錄,但原始目錄仍然存在)
我一直在試圖解決現在這一段時間,但我無法弄清楚到底是怎麼回事。尤其是因爲它在JVM從本機應用程序加載時工作。
預先感謝您!
我從來沒有使用'從JNI dlopen'出現了問題。這是什麼操作系統?這個'y'符號在哪裏定義?你確定JVM正在加載任何包含'y'的庫嗎? – 2012-02-27 18:47:46
是的,就像我說過的,我確認了在哪個庫符號y中使用'objdump -x | grep y'並檢查JVM是否正在使用'gdb'加載它。操作系統是Ubuntu 11.10 64位。我正在運行'Java HotSpot™64位服務器虛擬機(構建20.1-b02,混合模式)'的'Java™SE運行時環境(build 1.6.0_26-b03)''。我也確認了應該加載的庫也是64位的。 – 0xR 2012-02-28 13:45:27
我認爲我的問題與libtool的-export-dynamic標誌有關。不過,我試圖設置這一點,似乎並沒有解決問題。我會繼續嘗試。 – 0xR 2012-03-24 12:08:28