Java下出現異常Unable to load library的解決思路

最近在編譯Spatialite,查看Akka的ZeroMQ的demo程序是,容易出現java.lang.UnsatisfiedLinkError: Unable to load library錯誤。由於相關的Jar調用了native方法,但是相關的dll或者是so組件沒有進行註冊,導致失敗。下面根據上網資料歸納了一下在Windows平臺下解決思路(以下方法均未實測):


java中載入庫文件有兩個函數,System.load 和 System.loadLibrary


當使用System.load時,需要輸入文件的全路徑,例如:System.load(“/tmp/test.so”);

當使用System.loadlibrary時是在系統的library 的目錄中需找複合條件的庫文件,可以使用-Djava.library.path=[path]參數,來指定Java程序加載庫文件的路徑,或者將庫文件(*.so,*.dll)複製到include的默認路徑,Linux一般是/usr/lib目錄下,當然你可以編輯/etc/ld.so.conf.d/下的文件,設定自己的庫查找路徑ldconfig -v|grep xxx看看有沒有你的動態庫。Linux還要注意,使用System.loadLibrary(name)方法其中參數內容與Windows有區別,Linux中的的庫文件名爲libname.soWindowsname.dll


Windows中儘量使用WindowsC/C++編譯器生成dll文件,否則會出現問題。使用regsvr32 註冊dll 註冊成功後就可以了。如果不能註冊,說明dll缺少依賴的dll,可以使用Dependency Walker之類的工具查看dll依賴庫,把依賴的dll找到並註冊後再註冊自己的dll。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章