java.lang.UnsatisfiedLinkError: Can not load XXX library ... JNA不能載入DLL動態庫問題
java.lang.UnsatisfiedLinkError: Can not load XXX library ... JNA不能載入DLL動態庫問題
1, 版本問題。
版本一定要對應。
64位系統,對應64的jdk或者jre,同時對應動態庫也需要64位的。
32位也是如此對應。
如果機器上裝了兩套jre或jdk, 例如同時裝了32和64的jre, 需要將本機執行的jre設定為64的版本,具體為控制面板的java 控制檯中設定對應的java版本。
點選Java,檢視,進行查詢和新增等操作。確保64位的啟用。
2,路徑問題。
1:使用JNA 載入dll你首先需要下載JNA.jar,這個
2:dllName這個地方只能是dll的名字,不能加".dll"這個是為了跨平臺。
使用JNA通常會遇到不能載入的問題,這一般是應為dll檔案沒有放在正確的位置導致的。
路徑可以設定為絕對路徑或相對路徑。
絕對路徑:
TestDll1 INSTANCE = (TestDll1)Native.loadLibrary("D:\\test\\TestDll1", TestDll1.class);
然後DLL放到D盤下面test資料夾下。
相對路徑:
在web服務中,可以放到WEB-INF下res資料夾下
String realPath = ContextLoader.getCurrentWebApplicationContext().getServletContext().getRealPath("WEB-INF/res/TestDll1.dll"); String path =realPath.substring(0,realPath.length()-4); TestDll1 INSTANCE = (TestDll1)Native.loadLibrary( path, TestDll1.class);
PS:跨平臺的寫法
通常我們在使用JNA的時候會使用下面的方式(假設DLL名為helloDll.dll)
interface HelloDll extends Library {
TestDll1 INSTANCE = (TestDll1 )Native.loadLibrary("driver/TestDll1 ", TestDll1 .class);
public void hello();
}
1. 在這種情況下,我們需要將TestDll1 這個檔案拷貝到driver目錄下。
2. 同時為了跨平臺,相對路徑應該這麼寫:
"driver" + File.separator + "TestDll1
3. 另外,如果TestDll1 .dll依賴其他包的話,也要將包拷貝到driver目錄下或是系統路徑。檢視dll依賴關係的工具很多,google一下就行了。
參考:
經過上述步驟,基本可以解決,如果還不行,參考如下步驟:
1:dll檔案要放到專案路徑下;
2:把dll檔案放到庫檔案路徑下,執行這句程式碼 System.out.println(System.getProperty("java.library.path"));
然後把dll檔案copy到任意一個路徑下
3:dll名字好像不能帶有“_”(這個是我自己遇到的一個問題,僅供參考)
注意到這三點基本可以解決使用JNA載入C++,Delphi,C的dll的所有問題了。
連結:
http://blog.sina.com.cn/s/blog_b7c09bc00101d2sk.html
http://blog.csdn.net/zhhniyniy/article/details/7968752