我在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}的同一文件夹},src
,bibs
等等。这个文件夹的配置与我拥有的两个项目相同。此外,我已经测试了settings
方法,并且在两种情况下都返回了正确的路径。
编辑(2014年4月29日):
刚刚添加了一些有关错误消息的其他信息。我开始认为问题可能与JADE的使用有关......
答案 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并调整.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扩展名)。希望这有帮助。 :)