使用eclipse执行进行JNI调用的Java应用程序失败,出现UnsatisfiedLinkError:无法找到依赖库

时间:2014-04-25 17:01:57

标签: java eclipse java-native-interface unsatisfiedlinkerror

我有一个Java程序,它调用JNI库中的函数。 JNI代码静态加载另一个共享库。

使用Eclipse执行Java应用程序时,我收到错误java.lang.UnsatisfiedLinkError:...找不到依赖库

但是,如果我在命令行中执行相同的命令,程序运行正常。我在Eclipse中做错了什么?

我确保转到Debug View - >流程 - > Process Properties获取与Eclipse执行相同的命令字符串和相同的工作目录。

1 个答案:

答案 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匹配而不是操作系统)。