1. 程式人生 > >關於java用jni呼叫 dll動態庫Can't find dependent libraries錯誤的解決

關於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程式碼  收藏程式碼
  1.         package
     com.bsp.zauto.common;  
  2. public class JavaNativeCall {  
  3.     static {    
  4.         System.load(System.getProperty("user.dir")+"/lib/getcpu.dll");     
  5.     }     
  6.     public native int getCpuUsageRatio(int cputime);    
  7.  /** 
  8.   * @method main 
  9.   * @return void 
  10.   * @date 2011-9-12 下午06:39:19 
  11.   * @param args
     
  12.   * @decription (描述) 
  13.   */  
  14.  public static void main(String[] args) {  
  15.   // TODO Auto-generated method stub  
  16.   JavaNativeCall jc = new JavaNativeCall();  
  17.   System.out.println(jc.getCpuUsageRatio(1000));  
  18.  }  
  19. }  

執行報錯:

java.lang.UnsatisfiedLinkError: D:\workspace_bsp\myzauto\lib\getcpu.dll: Can't find dependent libraries。

載入後代碼:

Java程式碼  收藏程式碼
  1. package com.bsp.zauto.common;  
  2. public class JavaNativeCall {  
  3.     static {    
  4.         System.load(System.getProperty("user.dir")+"/lib/MSVCRTD.dll");    
  5.         System.load(System.getProperty("user.dir")+"/lib/MFC42D.dll");    
  6.         System.load(System.getProperty("user.dir")+"/lib/getcpu.dll");     
  7.     }     
  8.     public native int getCpuUsageRatio(int cputime);    
  9.  /** 
  10.   * @method main 
  11.   * @return void 
  12.   * @date 2011-9-12 下午06:39:19 
  13.   * @param args 
  14.   * @decription (描述) 
  15.   */  
  16.  public static void main(String[] args) {  
  17.   // TODO Auto-generated method stub  
  18.   JavaNativeCall jc = new JavaNativeCall();  
  19.   System.out.println(jc.getCpuUsageRatio(1000));  
  20.  }  
  21. }  

 執行成功。

這個問題網上沒有明確解決帖子,研究了半天才解決。寫此文章,望大家少走彎路。

注意事項:

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動態庫。