java.lang.UnsatisfiedLinkError - 本机方法问题

时间:2014-04-28 17:42:05

标签: java dll java-native-interface agents-jade

我在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是一个自定义的(由我工作的公司的前雇员创建)。

关于这个问题的奇怪之处在于我有2个执行类似任务的java项目。其中一个项目运行完美,而另一个项目正在经历UnsatisfiedLinkError

关于路径:我为工作区文件夹中包含的dll创建了一个特定的文件夹,但不是在项目文件夹中(换句话说,bin,{{1}的同一文件夹},srcbibs等等。这个文件夹的配置与我拥有的两个项目相同。此外,我已经测试了settings方法,并且在两种情况下都返回了正确的路径。

编辑(2014年4月29日):

刚刚添加了一些有关错误消息的其他信息。我开始认为问题可能与JADE的使用有关......

4 个答案:

答案 0 :(得分:1)

这是一个可以帮助您识别问题的PD程序。

将以下内容添加到程序中,以确定两个运行时环境之间的arch和load路径的差异。调查路径/拱门的任何差异。

 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匹配而不是操作系统)。

答案 1 :(得分:0)

与此处的几个答案相反,这不是库加载问题。查看堆栈跟踪。找到异常中指定的方法是一个问题。这是由实际名称和预期名称不匹配引起的。热门原因:

  • 不使用javah生成.h文件
  • .h和.c / .cpp文件中的方法签名不同意
  • 不包括.c或.cpp文件中的.h文件
  • 运行javah后更改Java类的包或名称
  • 运行javah后更改方法名称或签名

如果您执行最后两个中的任何一个,则必须重新运行javah并调整.c / .cpp文件以同意新.h文件中的新签名。

答案 2 :(得分:-1)

这可能是由于您的库的版本不匹配或位不匹配造成的。您可能正在使用64位操作系统,使用64位兼容版本的JAR文件。还要检查JARS之间的版本不匹配。

答案 3 :(得分:-1)

当您使用某个本机库时,您的系统将在环境变量和java.library.path中检查它。系统属性,如果它没有找到那么它将抛出java.lang.UnsatisfiedLinkError。 Windows选择dll表单system32,因为system32文件夹已存在于路径中,因此此方面的错误更改非常少。本机库使java代码平台依赖。检查您的java路径以获取所需的dll。检查java.library.path并尝试使用System.loadLibrary(“库名”)加载库(不带dll扩展名)。希望这有帮助。 :)