我关于动态链接库的使用经历的Java(Eclipse中)的一个问题。 到现在为止,我遇到了以下问题:
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 ...
编辑(28/04/2014):
而我试图使用DLL是一个自定义(被从公司我工作的前雇员创建)。
关于这个问题的奇怪的事情是,我有一个执行类似的任务2个Java项目。 这一个项目的完美运行,而另外一个正在经历的UnsatisfiedLinkError
。
关于道:我已经创建了该包含在工作区文件夹中的dll文件的特定文件夹,而不是项目文件夹内(换句话说,同一文件夹中bin
, src
, bibs
, settings
等都是)。 此文件夹的配置是相同的两个项目我有。 另外,我已经测试过System.out.println(System.getProperty("java.library.path")
方法,以及这两种情况下返回正确的道路。
编辑(29/04/2014):
刚刚添加有关错误消息的一些附加信息。 我开始觉得问题可能与玉的使用...
这里是一个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 VS 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位VS主/依赖性之间不匹配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代码依赖于平台。 检查所需的DLL你的java的路径。 请检查您的java.library.path,并尝试使用的System.loadLibrary(“库名”)来加载库(DLL没有扩展名)。 希望这有助于。 :)