1

我在 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 创建了一个特定文件夹,但不在项目文件夹中(换句话说,与 , , , 等所在的文件binsrc相同bibssettings。该文件夹的配置对于我拥有的两个项目都是相同的。此外,我已经测试了该System.out.println(System.getProperty("java.library.path")方法,并且在两种情况下都返回了正确的路径。

编辑(2014 年 4 月 29 日):

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

4

4 回答 4

1

这是一个 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 而不是操作系统)。

于 2014-04-29T04:16:39.047 回答
0

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

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

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

于 2014-04-30T21:46:01.500 回答
-1

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

于 2014-04-28T18:05:19.427 回答
-1

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

于 2014-04-28T18:21:39.557 回答