簡體   English   中英

java.lang.UnsatisfiedLinkError-本機方法問題

[英]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創建了一個特定的文件夾,但不在項目文件夾中(即, binsrcbibssettings等所在的文件夾)。 對於我擁有的兩個項目,此文件夾的配置均相同。 另外,我已經測試了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生成.h文件
  • .h和.c / .cpp文件中的方法簽名不一致
  • 在.c或.cpp文件中不包括.h文件
  • 運行javah后更改Java類的包或名稱
  • 運行javah后更改方法名稱或簽名

如果您執行了后兩者之一,則必須重新運行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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM