1. 程式人生 > >java.lang.UnsatisfiedLinkError: Can not load XXX library ... JNA不能載入DLL動態庫問題

java.lang.UnsatisfiedLinkError: Can not load XXX library ... JNA不能載入DLL動態庫問題

 java.lang.UnsatisfiedLinkError: Can not load XXX library ... JNA不能載入DLL動態庫問題

1, 版本問題。

版本一定要對應。

64位系統,對應64jdk或者jre,同時對應動態庫也需要64位的。

32位也是如此對應。

如果機器上裝了兩套jrejdk, 例如同時裝了3264jre, 需要將本機執行的jre設定為64的版本,具體為控制面板的java 控制檯中設定對應的java版本。

 點選Java,檢視,進行查詢和新增等操作。確保64位的啟用。


2,路徑問題。

1:使用JNA 載入dll你首先需要下載JNA.jar,這個

jar檔案可以在sun官網下載到。

2dllName這個地方只能是dll的名字,不能加".dll"這個是為了跨平臺。

使用JNA通常會遇到不能載入的問題,這一般是應為dll檔案沒有放在正確的位置導致的。

路徑可以設定為絕對路徑或相對路徑。

絕對路徑:

TestDll1 INSTANCE = (TestDll1)Native.loadLibrary("D:\\test\\TestDll1", TestDll1.class);

然後DLL放到D盤下面test資料夾下。

相對路徑:

web服務中,可以放到WEB-INFres資料夾下

  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一下就行了。

參考:

經過上述步驟,基本可以解決,如果還不行,參考如下步驟:

 1dll檔案要放到專案路徑下;

  2:把dll檔案放到庫檔案路徑下,執行這句程式碼 System.out.println(System.getProperty("java.library.path"));

       然後把dll檔案copy到任意一個路徑下

  3dll名字好像不能帶有“_”(這個是我自己遇到的一個問題,僅供參考)

注意到這三點基本可以解決使用JNA載入C++Delphi,Cdll的所有問題了。

連結:

http://blog.sina.com.cn/s/blog_b7c09bc00101d2sk.html

http://blog.csdn.net/zhhniyniy/article/details/7968752