[英]java.lang.UnsatisfiedLinkError - Native method issue
我在Java(Eclipse)中遇到有關dll用法的問題。 到目前為止,我遇到以下問題:
Uncaught Exception for agent SomeAgent
java.lang.UnsatisfiedLinkError: SomePackage.SomeClass.SomeNativeMethod(II)Z
[...]
at jade.core.behaviours.Behaviour.actionWrapper(Behaviour.java:344)
at jade.core.Agent$ActiveLifeCycle.execute(Agent.java:1532)
at jade.core.Agent.run(Agent.java:1471)
at java.lang.Thread.run(Thread.java:745)
我不知道這是否有助於解決問題,但我也在該項目中使用JADE ...
編輯(2014年4月28日):
我要使用的dll是一個自定義的dll(由我工作所在公司的前雇員創建)。
關於這個問題的奇怪之處在於,我有兩個執行類似任務的Java項目。 其中一個項目運行完美,而另一個項目遇到UnsatisfiedLinkError
。
關於路徑:我為工作區文件夾中包含的dll創建了一個特定的文件夾,但不在項目文件夾中(即, bin
, src
, bibs
, settings
等所在的文件夾)。 對於我擁有的兩個項目,此文件夾的配置均相同。 另外,我已經測試了System.out.println(System.getProperty("java.library.path")
方法,並且在兩種情況下都返回了正確的路徑。
編輯(2014年4月29日):
剛剛添加了有關錯誤消息的其他信息。 我開始認為問題可能與JADE的使用有關...
這是一個PD程序,可以幫助您發現問題。
將以下內容添加到您的程序中,以識別兩個運行時環境之間的架構和加載路徑之間的差異。 研究路徑/拱形中的任何差異。
System.out.println(System.getProperty("java.library.path"));
System.out.println(System.getProperty("sun.arch.data.model"));
您可以使用dumpbin.exe實用工具來識別正在加載的DLL所需的依賴項。 確保依賴項存在。 用法示例:
C:> dumpbin /imports your.dll
Dump of file your.dll
File Type: DLL
Section contains the following imports:
**KERNEL32.dll**
您可以使用where.exe命令查找依賴項的位置。 用法示例:
C:>where KERNEL32.dll
C:\Windows\System32\kernel32.dll
如果你看到:
C:>where KERNEL32.dll
INFO: Could not find files for the given pattern(s)
調查為什么相關的DLL不在路徑上。
您可以使用dumpbin.exe命令檢查64位和32位。
例:
C:>dumpbin /headers yourd.dll
Dump of file yourd.dll
PE signature found
File Type: DLL
FILE HEADER VALUES
14C machine (x86) <-- 32bit DLL
C:>dumpbin /headers yourd.dll
Dump of file yourd.dll
PE signature found
File Type: DLL
FILE HEADER VALUES
8664 machine (x64) <-- 64bit DLL
研究主/從屬之間的任何32位與64位不匹配情況。 如果您的JVM是32位的,則需要使用32位的DLL。 如果您的JVM是64位的,則需要使用64位的DLL。 (可以在64位操作系統上運行32位JVM,但JNI DLL必須為32位(DLL與JVM匹配,而不與OS匹配)。
與這里的幾個答案相反,這不是庫加載問題。 請參閱堆棧跟蹤。 定位異常中命名的方法是一個問題。 這是由於實際名稱和預期名稱不匹配引起的。 流行原因:
如果您執行了后兩者之一,則必須重新運行javah並調整.c / .cpp文件以與新.h文件中的新簽名一致。
這可能是由於庫的版本不匹配或位不匹配造成的。 您可能正在使用64位操作系統,請使用JAR文件的64位兼容版本。 還要檢查JARS之間的版本不匹配。
使用某些本機庫時,系統將同時在環境變量和java.library.path中對其進行檢查。 如果找不到系統屬性,則會拋出java.lang.UnsatisfiedLinkError。 Windows選擇dll形式為system32,因為該路徑中已經存在system32文件夾,因此,此側的錯誤更改非常少。 本機庫使Java代碼平台依賴。 檢查您的Java路徑中所需的dll。 檢查您的java.library.path並嘗試使用System.loadLibrary(“ library name”)加載您的庫(不帶dll擴展名)。 希望能有所幫助。 :)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.