java.lang.UnsatisfiedLinkError解决方法汇集(转载)
| 標(biāo)簽:報(bào)表軟件?報(bào)表工具?web報(bào)表?軟件?下載?it?如意報(bào)表? | 分類(lèi):基本概念 |
運(yùn)行JSP報(bào)表程序頁(yè)面出現(xiàn)java.lang.UnsatisfiedLinkError: CC錯(cuò)誤有以下幾種原因和處理方法:
1、請(qǐng)查看控制臺(tái)的錯(cuò)誤信息
a:如果控制臺(tái)的消息是類(lèi)似
java.lang.UnsatisfiedLinkError: no MRChkLib in java.library.path,Error loading library MRChkLib
這樣的錯(cuò)誤信息,那么是因?yàn)镸RChkLib.dll沒(méi)有拷貝到windows的System32目錄下.(MRChkLib.dll是加密鎖的JAVA接口文件,文件在報(bào)表安裝目錄DogDriver/JavaAPI下可以找到)并且要注意PATH環(huán)境變量中要包含System32目錄。(如果服務(wù)器操作系統(tǒng)是Linux,那么使用報(bào)表安裝目錄DogDriver/JavaAPI下的libMRChkLib.so文件,將libMRChkLib.so復(fù)制到WebServer的啟動(dòng)bin目錄。如果在這個(gè)目錄下仍然出現(xiàn)cannot load library錯(cuò)誤,請(qǐng)?jiān)O(shè)置系統(tǒng)環(huán)境變量LD_LIBRARY_PATH的值為libMRChkLib.so所在的目錄。
例如:如果libMRChkLib.so在/somedir目錄下,則 export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/somedir)
b:如果控制臺(tái)的消息是類(lèi)似
java.lang.unsatisfiedLinkError:native libery c:/winnt/system32/mrchklib.dll already loaded in anotherclassLoader error loading mrchklib.dll
這樣的錯(cuò)誤信息,那么是因?yàn)閃ebAPP在重新被啟動(dòng)之后,無(wú)法再次加載動(dòng)態(tài)庫(kù)造成的,這是java的約束,Java不允許一個(gè)實(shí)例加載多次動(dòng)態(tài)庫(kù).可以這樣解決,將mr.jar拷貝到WebServer的lib目錄,刪除/WEB-INF/lib目錄下的mr.jar,然后重新啟動(dòng)webserver。
2、如果一個(gè)webserver上有多個(gè)報(bào)表應(yīng)用,請(qǐng)將/WEB-INF/lib/mr.jar移動(dòng)到WebServer的lib目錄下,確保每一個(gè)Web應(yīng)用程序目錄下都沒(méi)有mr.jar,而只有WebServer的lib目錄下有該文件,重啟webserver.
3、一個(gè)Webserver上只能有一個(gè)mr.jar文件,刪掉多余的mr*.jar文件,然后清除webserver臨時(shí)文件,重新啟動(dòng)webserver。 =================================================================================== 最近項(xiàng)目中用到了jni,于是安裝了eclipse的cdt和MinGW來(lái)用,以前沒(méi)怎么動(dòng)過(guò)C語(yǔ)言,網(wǎng)上找了下教程,倒是挺容易的,一路弄下來(lái)也沒(méi)提示什么錯(cuò)誤,但是在最后調(diào)用本地方法時(shí)卻遇到了大麻煩,總是提示找不到方法。即使一個(gè)簡(jiǎn)單的HelloWorld,也是一樣
Exception in thread "main" java.lang.UnsatisfiedLinkError: HelloWorld.print()V
奇怪了,loadLibrary()沒(méi)有問(wèn)題,怎么會(huì)找不到方法呢?用dll export viewer察看,導(dǎo)出的方法為
函數(shù)名 地址 偏移量
Java_HelloWorld_print@8 0x67741250 0x00001250
實(shí)在沒(méi)辦法了,只好安裝龐大的visual studio重新來(lái)編譯,調(diào)用成功了!
再次用dll export viewer查看,發(fā)現(xiàn)函數(shù)名的前面多了一條下劃線(xiàn)
函數(shù)名 地址 偏移量
_Java_HelloWorld_print@8 0x67741250 0x00001250
看來(lái)是給MinGW少傳了某個(gè)參數(shù),經(jīng)過(guò)網(wǎng)上查閱資料,終于找到一個(gè)解決方案:給MinGW的ld命令指定一個(gè)參數(shù)--kill-at即可
gcc -Wl, --kill-at -shared -o jnihello.dll HelloWorld.c
再次用dll export viewer查看,發(fā)現(xiàn)導(dǎo)出的函數(shù)名稱(chēng)變?yōu)?
函數(shù)名 地址 偏移量
Java_HelloWorld_print 0x67741250 0x00001250
--kill-at指令去掉了函數(shù)名稱(chēng)后綴的@,并沒(méi)有像msvc那樣添加前綴的下劃線(xiàn) ======================================================================== 現(xiàn)象: java.lang.UnsatisfiedLinkError: Native Library xxx.dll alreadyloaded in another classloader atjava.lang.ClassLoader.loadLibrary0(ClassLoader.java:1551) atjava.lang.ClassLoader.loadLibrary(ClassLoader.java:1511) atjava.lang.Runtime.loadLibrary0(Runtime.java:788) atjava.lang.System.loadLibrary(System.java:834) 分析:這種錯(cuò)誤在我們使用熱啟動(dòng)方式發(fā)布某個(gè)使用了JNI技術(shù)的Web應(yīng)用時(shí),并將調(diào)用年native方法的jar包獨(dú)立部署在該應(yīng)用下面,當(dāng)我們的Web應(yīng)用有了更新以后,在調(diào)用到該jar包封裝的native方法時(shí),會(huì)拋出該錯(cuò)誤。(以上OS為Windows,若是Linux或Unix,應(yīng)該是xxx.so報(bào)錯(cuò)) 這是因?yàn)閃eb服務(wù)器已經(jīng)在第一次加載該應(yīng)用時(shí),已經(jīng)load了該dll,當(dāng)該應(yīng)用被再次熱啟動(dòng)時(shí),該dll將重新被加載,于是報(bào)錯(cuò)。解決方案: 一、將含有JNI調(diào)用的jar包部署在Web服務(wù)器的公用lib庫(kù)中。Web應(yīng)用再發(fā)布時(shí)可以不用加載;二、jar包部署不變,在該Web中實(shí)現(xiàn)一個(gè)listener,監(jiān)聽(tīng)是否第一次啟動(dòng),若不是第一次啟動(dòng),屏蔽掉該jar包所含dll的加載。 ========================================================================
| 類(lèi)裝入問(wèn)題:UnsatisfiedLinkError | ||
| 作者:Simon Burns 來(lái)源:IBM 整理日期:2007-6-3 | ||
| UnsatisfiedLinkError 在把本機(jī)調(diào)用鏈接到對(duì)應(yīng)的本機(jī)定義時(shí),類(lèi)裝入器扮演著重要角色。如果程序試圖裝入一個(gè)不存在或者放錯(cuò)的本機(jī)庫(kù)時(shí),在鏈接階段的解析過(guò)程會(huì)發(fā)生 UnsatisfiedLinkError。JVM 規(guī)范指定 UnsatisfiedLinkError 是: 對(duì)于聲明為 native?的方法,如果 Java 虛擬機(jī)找不到和它對(duì)應(yīng)的本機(jī)語(yǔ)言定義,就會(huì)拋出該異常。當(dāng)調(diào)用本機(jī)方法時(shí),類(lèi)裝入器會(huì)嘗試裝入定義了該方法的本機(jī)庫(kù)。如果找不到這個(gè)庫(kù),就會(huì)拋出這個(gè)錯(cuò)誤。 清單 6 演示了拋出 UnsatisfiedLinkError 的測(cè)試用例 : 清單 6. UnsatisfiedLinkError.java
這段代碼調(diào)用本機(jī)方法 call_A_Native_Method(),該方法是在本機(jī)庫(kù) myNativeLibrary 中定義的。因?yàn)檫@個(gè)庫(kù)不存在,所以在程序運(yùn)行時(shí)會(huì)發(fā)生以下錯(cuò)誤:
本機(jī)庫(kù)的裝入由調(diào)用 System.loadLibrary() 方法的類(lèi)的類(lèi)裝入器啟動(dòng) —— 在清單 6 中,就是 UnsatisfiedLinkErrorTest 的類(lèi)裝入器。根據(jù)使用的類(lèi)裝入器,會(huì)搜索不同的位置:
在清單 6 中,UnsatisfiedLinkErrorTest 類(lèi)是由系統(tǒng)類(lèi)裝入器裝入的。要裝入所引用的本機(jī)庫(kù),這個(gè)類(lèi)裝入器先查找 sun.boot.library.path,然后查找 java.library.path。因?yàn)樵趦蓚€(gè)位置中都沒(méi)有需要的庫(kù),所以類(lèi)裝入器拋出 UnsatisfiedLinkageError。 |
| java.lang.UnsatisfiedLinkError出現(xiàn)這種錯(cuò)誤的原因是一般是java虛擬機(jī)找不到聲明為native方法的本地語(yǔ)言定義時(shí),出現(xiàn)的錯(cuò)誤。在我的理解過(guò)程中我一般都認(rèn)為是由于導(dǎo)入dll或者導(dǎo)入lib文件不正確導(dǎo)致的。有些需要靜態(tài)導(dǎo)入就沒(méi)有問(wèn)題(即在前面加static來(lái)導(dǎo)入lib文件),如果是不加static導(dǎo)入也就是動(dòng)態(tài)導(dǎo)入的時(shí)候,那么需要添加catch的拋出異常來(lái)解決,如 try{ 這種方式來(lái)判斷,或者直接在類(lèi)前面添加 static{ ?? System.loadLibrary("vtkCommonJava");
==================================================================================== 另外,還可能是dll本身的問(wèn)題,使用release版的,而不要用debug版的 |
關(guān)于編寫(xiě)JNI時(shí)的發(fā)生的unsatisfiedlinkError錯(cuò)誤- -
?
?
這個(gè)錯(cuò)誤也讓我郁悶了半天,現(xiàn)在我把它寫(xiě)出來(lái),可以讓大家少走點(diǎn)彎路。一般這個(gè)錯(cuò)誤有兩種:
1。unsatisfiedlinkError:dll名,那說(shuō)明你沒(méi)有把dll放到合適的位置,一般就和要調(diào)用原生函數(shù)的類(lèi)放在一起,當(dāng)然前提是你成功的生成dll了
2。unsatisfiedlinkError:方法名,這個(gè)時(shí)候你其實(shí)dll已經(jīng)成功生成了,而且位置也正確,它的意思就是你沒(méi)有定義那個(gè)函數(shù),你可能會(huì)說(shuō),我明明定義了,其實(shí)當(dāng)你發(fā)現(xiàn)問(wèn)題所在,你只能自虐了,肯定是你在C文件中定義函數(shù)時(shí)有些字母大小寫(xiě)錯(cuò)了,因?yàn)槠渌胤绞亲詣?dòng)生成的,不會(huì)出錯(cuò)。尤其是直接從網(wǎng)上拷貝源程序時(shí)經(jīng)常發(fā)生這種問(wèn)題,有些作者不負(fù)責(zé)任,把有錯(cuò)誤的程序也貼上去。
?
轉(zhuǎn)自:http://www.360doc.com/content/090402/09/107226_2994393.html
總結(jié)
以上是生活随笔為你收集整理的java.lang.UnsatisfiedLinkError解决方法汇集(转载)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: yoloV5模型训练教程并进行量化
- 下一篇: 做一个简单的打飞碟游戏