關於java用jni呼叫 dll動態庫Can't find dependent libraries錯誤的解決
最近在做一些java開發的時候,需要呼叫作業系統底層的一些東西,所以我用c++ 寫了一個dll動態庫檔案,通過java的JNI進行呼叫。dll 檔案生成之後 在本機用java呼叫沒有問題, 但是換了一臺主機就報錯了,報錯如下:
java.lang.UnsatisfiedLinkError: D:\workspace_bsp\myzauto\lib\getcpu.dll: Can't find dependent libraries。
大概意思是找不到依賴庫。
由於是第一次用java呼叫dll動態庫,所以不知道這個問題該怎麼解決。在網上查了半天都沒有結果,網上也沒有解決方案。只知道缺少依賴的dll 。 但是我不知道 缺少哪些動態庫。於是我就從想辦法找如何查詢缺失依賴庫的辦法,終於在網上找到一個工具,可以檢視你所用的 dll的依賴庫,如我的(getcpu.dll)。
工具的名字為《DLL依賴檢視工具》。見附近下載。
解壓, 雙擊開啟DLL依賴檢視工具 ,開啟你得dll檔案(如:getcpu.dll);顯示結果如圖(見附件,由於不知道怎麼插入圖片)
圖片中帶有黃色問號的是缺失的dll檔案, 你在網上下載缺失的 dll檔案(例如我缺失的 MSVCRTD.dll 和 MFC42D.dll)。
下載成功後,載入進去,或者放在 system32目錄下。 即可。然後 再用java呼叫getcpu.dll 就成功了。
之前沒加缺失dll庫檔案時的程式碼:
Java程式碼![收藏程式碼](http://sylar029.iteye.com/images/icon_star.png)
-
package
- public class JavaNativeCall {
- static {
- System.load(System.getProperty("user.dir")+"/lib/getcpu.dll");
- }
- public native int getCpuUsageRatio(int cputime);
- /**
- * @method main
- * @return void
- * @date 2011-9-12 下午06:39:19
-
* @param args
- * @decription (描述)
- */
- public static void main(String[] args) {
- // TODO Auto-generated method stub
- JavaNativeCall jc = new JavaNativeCall();
- System.out.println(jc.getCpuUsageRatio(1000));
- }
- }
執行報錯:
java.lang.UnsatisfiedLinkError: D:\workspace_bsp\myzauto\lib\getcpu.dll: Can't find dependent libraries。
載入後代碼:
Java程式碼![收藏程式碼](http://sylar029.iteye.com/images/icon_star.png)
- package com.bsp.zauto.common;
- public class JavaNativeCall {
- static {
- System.load(System.getProperty("user.dir")+"/lib/MSVCRTD.dll");
- System.load(System.getProperty("user.dir")+"/lib/MFC42D.dll");
- System.load(System.getProperty("user.dir")+"/lib/getcpu.dll");
- }
- public native int getCpuUsageRatio(int cputime);
- /**
- * @method main
- * @return void
- * @date 2011-9-12 下午06:39:19
- * @param args
- * @decription (描述)
- */
- public static void main(String[] args) {
- // TODO Auto-generated method stub
- JavaNativeCall jc = new JavaNativeCall();
- System.out.println(jc.getCpuUsageRatio(1000));
- }
- }
執行成功。
這個問題網上沒有明確解決帖子,研究了半天才解決。寫此文章,望大家少走彎路。
注意事項:
1:依賴庫的順序。
System.load(System.getProperty("user.dir")+"/lib/MSVCRTD.dll");
System.load(System.getProperty("user.dir")+"/lib/MFC42D.dll");
System.load(System.getProperty("user.dir")+"/lib/getcpu.dll");
這個順序須按照你的呼叫依賴庫的順序排列。 如果順序寫反了,依然會報 Can't find dependent libraries的錯。
所以,如果把所需的依賴庫都載入了,還報錯,試著修改這幾個依賴庫的順序。
2:dll檔案的下載地址:
這個網站可以搜尋,下載你所需的dll動態庫。