java.lang.UnsatifiedLinkError-本机方法问题
我在Java(Eclipse)中遇到了一个关于DLL使用的问题。到目前为止,我遇到以下问题:java.lang.UnsatifiedLinkError-本机方法问题,java,dll,java-native-interface,agents-jade,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.
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项目,它们执行类似的任务。其中一个项目运行良好,而另一个项目遇到了未满足的链接错误
关于路径:我已经为DLL创建了一个特定的文件夹,它包含在工作区文件夹中,但不在项目文件夹中(换句话说,在相同的文件夹中,bin
,src
,bibs
,设置
,等等)。对于我拥有的两个项目,此文件夹的配置是相同的。另外,我已经测试了System.out.println(System.getProperty(“java.library.path”)
方法,在这两种情况下都返回了正确的路径
编辑(2014年4月29日):
刚刚添加了一些有关错误消息的附加信息。我开始认为问题可能与JADE的使用有关…这可能是由于库的版本不匹配或位不匹配。您可能正在使用64位操作系统,请使用64位兼容版本的JAR文件。另外,请检查JARS.当您使用某个本机库时,您的系统将在环境变量和java.library.path.system属性中检查它,如果在那里找不到它,则将抛出java.lang.unsatifiedlinkerror。Windows从system32中选取dll,因为system32文件夹已存在于路径中,因此从该sid中发生的错误更改非常少e、 本机库使java代码依赖于平台。请检查java路径中所需的dll。检查java.library.path,并尝试使用System.loadLibrary(“库名”)加载库(不带dll扩展)。希望获得此帮助。:)以下是一个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**
C:>where KERNEL32.dll
C:\Windows\System32\kernel32.dll
可以使用where.exe命令查找依赖项的位置。
用法示例:
C:> dumpbin /imports your.dll
Dump of file your.dll
File Type: DLL
Section contains the following imports:
**KERNEL32.dll**
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/d.dll
转储文件yourd.dll
找到PE签名
文件类型:DLL
文件头值
14C计算机(x86)转储bin/d.dll
转储文件yourd.dll
找到PE签名
文件类型:DLL
文件头值
8664机器(x64)与这里的几个答案相反,这不是库加载问题。查看堆栈跟踪。查找异常中命名的方法时出现问题。这是由于实际名称与预期名称不匹配造成的。流行原因:
- 不使用javah生成.h文件
- .h和.c/.cpp文件中的方法签名不一致
- 在.c或.cpp文件中不包括.h文件
- 运行javah后更改Java类的包或名称
- 运行javah后更改方法名称或签名
如果执行最后两种操作之一,则必须重新运行javah并调整.c/.cpp文件,使其与新.h文件中的新签名一致。此类错误通常由程序中的库引起。这是自定义DLL还是标准DLL?DLL是否在库路径中?您是否在eclipse中添加了库@Mudkip:检查java的路径,并使用java-Djava.library.path=“dll path here”运行应用程序。只需编辑文本。提前谢谢!嗯,我测试了你推荐的所有东西,看起来bits兼容性没有问题。然而,我只是注意到有一些与jade相关的错误消息(参见我今天的版本)。问题可能与翡翠与环境不相容有关?