java.lang.UnsatisfiedLinkError解決方法彙集(轉載)
執行JSP報表程式頁面出現java.lang.UnsatisfiedLinkError: CC錯誤有以下幾種原因和處理方法:
1、請檢視控制檯的錯誤資訊
a:如果控制檯的訊息是類似
java.lang.UnsatisfiedLinkError: no MRChkLib in java.library.path,Error loading library MRChkLib
這樣的錯誤資訊,那麼是因為MRChkLib.dll沒有拷貝到windows的System32目錄下.
(MRChkLib.dll是加密鎖的JAVA介面檔案,檔案在報表安裝目錄DogDriver/JavaAPI下可以找到)
並且要注意PATH環境變數中要包含System32目錄。(如果伺服器作業系統是Linux,那麼使用報表安裝目錄DogDriver/JavaAPI
下的libMRChkLib.so檔案,將libMRChkLib.so複製到WebServer的啟動bin目錄。如果在這個目錄下仍然出現can
not load library錯誤,請設定系統環境變數LD_LIBRARY_PATH的值為libMRChkLib.so所在的目錄。
例如:如果libMRChkLib.so在/somedir目錄下,則 export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/somedir)
b:如果控制檯的訊息是類似
java.lang.unsatisfiedLinkError
:native libery c:/winnt/system32/mrchklib.dll already loaded in another
classLoader error loading mrchklib.dll
這樣的錯誤資訊,那麼是因為WebAPP在重新被啟動之後,無法再次載入動態庫造成的,這是java的約束,Java不允許一個例項載入多次動態 庫.可以這樣解決,將mr.jar拷貝到WebServer的lib目錄,刪除/WEB-INF/lib目錄下的mr.jar,然後重新啟動 webserver。
2、如果一個webserver上有多個報表應用,請將/WEB-INF/lib/mr.jar移動到WebServer的lib目錄下,確保每一個Web應用程式目錄下都沒有mr.jar,而只有WebServer的lib目錄下有該檔案,重啟webserver.
3、一個Webserver上只能有一個mr.jar檔案,刪掉多餘的mr*.jar檔案,然後清除webserver臨時檔案,重新啟動webserver。 =================================================================================== 最近專案中用到了jni,於是安裝了eclipse的cdt和MinGW來用,以前沒怎麼動過C語言,網上找了下教程,倒是挺容易的,一路弄下來也沒提示什麼錯誤,但是在最後呼叫本地方法時卻遇到了大麻煩,總是提示找不到方法。即使一個簡單的HelloWorld,也是一樣
Exception in thread "main" java.lang.UnsatisfiedLinkError: HelloWorld.print()V
奇怪了,loadLibrary()沒有問題,怎麼會找不到方法呢?用dll export viewer察看,匯出的方法為
函式名 地址 偏移量
實在沒辦法了,只好安裝龐大的visual studio重新來編譯,呼叫成功了!
再次用dll export viewer檢視,發現函式名的前面多了一條下劃線
函式名 地址 偏移量
[email protected] 0x67741250 0x00001250
看來是給MinGW少傳了某個引數,經過網上查閱資料,終於找到一個解決方案:給MinGW的ld命令指定一個引數--kill-at即可
gcc -Wl, --kill-at -shared -o jnihello.dll HelloWorld.c
再次用dll export viewer檢視,發現匯出的函式名稱變為
函式名 地址 偏移量
Java_HelloWorld_print 0x67741250 0x00001250
--kill-at指令去掉了函式名稱字尾的@,並沒有像msvc那樣新增字首的下劃線 ======================================================================== 現象: java.lang.UnsatisfiedLinkError: Native Library xxx.dll already loaded in another classloader at java.lang.ClassLoader.loadLibrary0(ClassLoader.java:1551) at java.lang.ClassLoader.loadLibrary(ClassLoader.java:1511) at java.lang.Runtime.loadLibrary0(Runtime.java:788) at java.lang.System.loadLibrary(System.java:834) 分析: 這種錯誤在我們使用熱啟動方式釋出某個使用了JNI技術的Web應用時,並將呼叫年native方法的jar包獨立部署在該應用下面,當我們的Web應用 有了更新以後,在呼叫到該jar包封裝的native方法時,會丟擲該錯誤。(以上OS為Windows,若是Linux或Unix,應該是xxx.so 報錯) 這是因為Web伺服器已經在第一次載入該應用時,已經load了該dll,當該應用被再次熱啟動時,該dll將重新被載入,於是報錯。 解決方案: 一、將含有JNI呼叫的jar包部署在Web伺服器的公用lib庫中。Web應用再發布時可以不用載入; 二、jar包部署不變,在該Web中實現一個listener,監聽是否第一次啟動,若不是第一次啟動,遮蔽掉該jar包所含dll的載入。 ========================================================================
類裝入問題:UnsatisfiedLinkError | ||
在把本機呼叫連結到對應的本機定義時,類裝入器扮演著重要角色。如果程式試圖裝入一個不存在或者放錯的本機庫時,在連結階段的解析過程會發生 對於宣告為
當呼叫本機方法時,類裝入器會嘗試裝入定義了該方法的本機庫。如果找不到這個庫,就會丟擲這個錯誤。 清單 6 演示了丟擲 清單 6. UnsatisfiedLinkError.java
這段程式碼呼叫本機方法
本機庫的裝入由呼叫
在清單 6 中, |
java.lang.UnsatisfiedLinkError 出現這種錯誤的原因是一般是java虛擬機器找不到宣告為native方法的本地語言定義時,出現的錯誤。在我的理解過程中我一般都認為是由於匯入dll或 者匯入lib檔案不正確導致的。有些需要靜態匯入就沒有問題(即在前面加static來匯入lib檔案),如果是不加static匯入也就是動態匯入的時 候,那麼需要新增catch的丟擲異常來解決,如 try{ 這種方式來判斷,或者直接在類前面新增 static{ System.loadLibrary("vtkCommonJava");
==================================================================================== 另外,還可能是dll本身的問題,使用release版的,而不要用debug版的 |