日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪(fǎng)問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

java.lang.UnsatisfiedLinkError解决方法汇集(转载)

發(fā)布時(shí)間:2023/12/20 编程问答 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java.lang.UnsatisfiedLinkError解决方法汇集(转载) 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
J2EE引擎出現(xiàn)java.lang.UnsatisfiedLinkError:?CC錯(cuò)誤的原因(2008-03-04 11:03:29)
標(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
public class UnsatisfiedLinkErrorTest {public native void call_A_Native_Method();static {System.loadLibrary("myNativeLibrary");}public static void main(String[] args) {new UnsatisfiedLinkErrorTest().call_A_Native_Method();}}

這段代碼調(diào)用本機(jī)方法 call_A_Native_Method(),該方法是在本機(jī)庫(kù) myNativeLibrary 中定義的。因?yàn)檫@個(gè)庫(kù)不存在,所以在程序運(yùn)行時(shí)會(huì)發(fā)生以下錯(cuò)誤:

The <a target=_blank class="homepage" href="http://www.gold98.net/artics/java/">java</a> class could not be loaded. <a target=_blank class="homepage" href="http://www.gold98.net/artics/java/">java</a>.lang.UnsatisfiedLinkError:Cant find library myNativeLibrary (myNativeLibrary.dll)in sun.boot.library.path or <a target=_blank class="homepage" href="http://www.gold98.net/artics/java/">java</a>.library.pathsun.boot.library.path=D:/sdk/jre/bin<a target=_blank class="homepage" href="http://www.gold98.net/artics/java/">java</a>.library.path= D:/sdk/jre/binat <a target=_blank class="homepage" href="http://www.gold98.net/artics/java/">java</a>.lang.ClassLoader$NativeLibrary.load(Native Method)at <a target=_blank class="homepage" href="http://www.gold98.net/artics/java/">java</a>.lang.ClassLoader.loadLibrary0(ClassLoader.<a target=_blank class="homepage" href="http://www.gold98.net/artics/java/">java</a>:2147)at <a target=_blank class="homepage" href="http://www.gold98.net/artics/java/">java</a>.lang.ClassLoader.loadLibrary(ClassLoader.<a target=_blank class="homepage" href="http://www.gold98.net/artics/java/">java</a>:2006)at <a target=_blank class="homepage" href="http://www.gold98.net/artics/java/">java</a>.lang.Runtime.loadLibrary0(Runtime.<a target=_blank class="homepage" href="http://www.gold98.net/artics/java/">java</a>:824)at <a target=_blank class="homepage" href="http://www.gold98.net/artics/java/">java</a>.lang.System.loadLibrary(System.<a target=_blank class="homepage" href="http://www.gold98.net/artics/java/">java</a>:908)at UnsatisfiedLinkErrorTest.<clinit>(UnsatisfiedLinkErrorTest.<a target=_blank class="homepage" href="http://www.gold98.net/artics/java/">java</a>:6)

本機(jī)庫(kù)的裝入由調(diào)用 System.loadLibrary() 方法的類(lèi)的類(lèi)裝入器啟動(dòng) —— 在清單 6 中,就是 UnsatisfiedLinkErrorTest 的類(lèi)裝入器。根據(jù)使用的類(lèi)裝入器,會(huì)搜索不同的位置:

  • 對(duì)于由 bootstrap 類(lèi)裝入器裝入的類(lèi),搜索 sun.boot.library.path。
  • 對(duì)于由擴(kuò)展類(lèi)裝入器裝入的類(lèi),先搜索 java.ext.dirs,然后是 sun.boot.library.path,然后是 java.library.path。
  • 對(duì)于由系統(tǒng)類(lèi)裝入器裝入的類(lèi),搜索 sun.boot.library.path,然后是 java.library.path。

在清單 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{
??? System.loadLibrary("vtkCommonJava");
??? System.loadLibrary("vtkFilteringJava");
??? System.loadLibrary("vtkIOJava");
??? System.loadLibrary("vtkImagingJava");
??? System.loadLibrary("vtkGraphicsJava");
??? System.loadLibrary("vtkRenderingJava");
?? }catch(Throwable e)
?? {
??? System.out.println("The load problem");
?? }

這種方式來(lái)判斷,或者直接在類(lèi)前面添加

static{

?? System.loadLibrary("vtkCommonJava");
??? System.loadLibrary("vtkFilteringJava");
??? System.loadLibrary("vtkIOJava");
??? System.loadLibrary("vtkImagingJava");
??? System.loadLibrary("vtkGraphicsJava");
??? System.loadLibrary("vtkRenderingJava");

} ================================================================================
關(guān)于java.lang.UnsatisfiedLinkError(JNI)
?
?
目標(biāo):把pbp1.0的java包和native移到GEM中,并使GEM在新的虛擬機(jī)上正常運(yùn)行
??? 背景:GEM(1)有一堆java包和native函數(shù),pbp1.0是虛擬機(jī)和JAVA基本包,要將pbp1.0的虛擬機(jī)移走只用它的JAVA基本包和native函數(shù)。
??? 問(wèn)題:在將GEM和pbp1.0的native函數(shù)生成一個(gè)動(dòng)態(tài)庫(kù)后在程序里System.loadLibrary()無(wú)法加載,報(bào)java.lang.UnsatisfiedLinkError
??? 解決過(guò)程:
??? 1,理論
???我們知道,JAVA調(diào)用native函數(shù)時(shí),必須通過(guò)System.loadLibrary()或System.load將其native函數(shù)所在動(dòng)態(tài)庫(kù)加載到虛擬機(jī)。并在運(yùn)行時(shí)指明-Djava.library.path或-Dsun.boot.library.path,將其指向包含有native函數(shù)的動(dòng)態(tài)庫(kù)所在位置。
??? 2,實(shí)施
???我按這個(gè)步驟操作完成后就是無(wú)法加載我生成的動(dòng)態(tài)庫(kù)libgem.so,這個(gè)庫(kù)用到的其他動(dòng)態(tài)庫(kù)包括:rt,pthread,freetype,dl,directfb,而directfb用到的動(dòng)態(tài)庫(kù)有rt,dl,pthread,freetype,jpeg,png,這些庫(kù)除了directfb要生成外其余都在/lib目錄下存在。
??? 3,思路
??? 先寫(xiě)了一個(gè)Hello的測(cè)試用例。發(fā)現(xiàn)在native里所使用到其他動(dòng)態(tài)庫(kù)時(shí),無(wú)論是否存在于相關(guān)目錄,仍然無(wú)法加載。然后經(jīng)過(guò)修改編譯選項(xiàng),把所使用到的動(dòng)態(tài)庫(kù)連動(dòng)態(tài)連接進(jìn)目標(biāo)庫(kù),如下:
??? $(GCC) -fPIC -shared -o libdirectfb.so ... -lpng -ljpeg -lpthread -lrt -ldl, -lfreetype
??? 經(jīng)過(guò)這么一個(gè)修改后,directfb可以加載。
???這也說(shuō)明System.loadLibrary()所加載的動(dòng)態(tài)庫(kù)所引用的所有符號(hào)都要能找到。如果有一個(gè)無(wú)法找到將無(wú)法加載。可以寫(xiě)一個(gè)空的main()函數(shù),對(duì)你的動(dòng)態(tài)庫(kù)進(jìn)行連接,如果動(dòng)態(tài)庫(kù)里所引用的符號(hào)在指定的動(dòng)態(tài)庫(kù)和本身找到不到則無(wú)法編譯通過(guò),那么這個(gè)動(dòng)態(tài)庫(kù)也肯定加載不了。
??? 4,問(wèn)題解決
??? 按照這個(gè)思路,對(duì)libgem.so的編譯Makefile做相應(yīng)修改后,問(wèn)題解決!并在LD_LIBRARY_PATH加入動(dòng)態(tài)庫(kù)所在目錄。

(1)MHP (Multimedia Home Platform) was developed by the DVB Project as theworld's first open standard for interactive television. It is aJava-based environment which defines a generic interface betweeninteractive digital applications and the terminals on which thoseapplications execute. MHP was designed to run on DVB platforms butthere was a demand to extend the interoperability it offers to otherdigital television platforms. This demand gave rise to GEM, or Globally Executable MHP, a framework which allows other organisations to define specifications based on MHP.

====================================================================================

另外,還可能是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)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。