为什么我会得到java.lang.UnsatisfiedLinkError:无法加载库?

时间:2013-07-17 11:25:42

标签: java windows jna

我正在尝试使用JNA从我的Java应用程序调用.dll文件。我得到以下例外:

  

线程“main”中的异常java.lang.UnsatisfiedLinkError:无法加载库'C:\ Windows \ System32 \ foo.dll':找不到指定的模块。

.dll和我的jdk都是32位(OS_ARCH =“i586”)虽然我在64位Windows 7 PC上运行它。
.dll位于System32文件夹中。

我正在使用Eclipse并将System32文件夹添加到Java构建路径属性中“库”选项卡下的JRE系统库中的本机库位置(尽管我认为这不是必需的)。

如果有任何帮助或建议,我将不胜感激 谢谢,
-Munk。

4 个答案:

答案 0 :(得分:1)

这是file system redirector。您正在WOW64仿真器下执行,该仿真器在64位系统上模拟32位Windows。在WOW64下,system32被重定向到SysWOW64。你需要把你的DLL放在那里。

据说,系统目录由系统拥有并且是私有的。您不应将DLL放入系统目录。您应该找到一种方法将DLL放在其他位置。

答案 1 :(得分:0)

错误的另一个原因是dll仅支持32版本而不支持64位操作系统。您必须确认dll供应商。

答案 2 :(得分:0)

我的操作系统是windows-x64,而我的jdk是x64。所以问题与你相同。 我的解决方案是你必须安装jdk-x86,并将你的dll放入jdk-x86 / bin目录。

答案 3 :(得分:0)

如果dll文件未损坏,则可能出现此问题的三个原因:

  1. 32位64位兼容性。 32位dll只能在32位jdk或jre上运行。 通过使用Cygwin命令file <filename>,我们可以确定dll是32位还是64位。

  2. dll没有正确的路径,因此java找不到它。一般来说,我们可以使用System32以外的其他绝对路径来确保路径正确。

  3. 我们正在加载的dll需要其他dll。

我们如何处理第三种可能性:

    与JNA相比,使用
  1. 使用JNI的System.loadLibrary()方法可以给我更多提示。可能会说类似:Exception in thread "main" java.lang.UnsatisfiedLinkError: MyLibrary.dll: Can't find dependent libraries. 这意味着缺少MyLibrary.dll个依赖的库。通过使用dependency walker,我们可以知道需要哪些dll。

  2. 通过在要加载的dll之前加载这些dll,我们可以解决此问题。