我有一个Java程序,它调用JNI库中的函数。 JNI代码静态加载另一个共享库。
使用Eclipse执行Java应用程序时,我收到错误java.lang.UnsatisfiedLinkError:...找不到依赖库
但是,如果我在命令行中执行相同的命令,程序运行正常。我在Eclipse中做错了什么?
我确保转到Debug View - >流程 - > Process Properties获取与Eclipse执行相同的命令字符串和相同的工作目录。
答案 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匹配而不是操作系统)。