我正在尝试使用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。
答案 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文件未损坏,则可能出现此问题的三个原因:
32位64位兼容性。 32位dll只能在32位jdk或jre上运行。
通过使用Cygwin命令file <filename>
,我们可以确定dll是32位还是64位。
dll没有正确的路径,因此java找不到它。一般来说,我们可以使用System32
以外的其他绝对路径来确保路径正确。
我们正在加载的dll需要其他dll。
我们如何处理第三种可能性:
使用JNI的System.loadLibrary()
方法可以给我更多提示。可能会说类似:Exception in thread "main" java.lang.UnsatisfiedLinkError: MyLibrary.dll: Can't find dependent libraries.
这意味着缺少MyLibrary.dll
个依赖的库。通过使用dependency walker,我们可以知道需要哪些dll。
通过在要加载的dll之前加载这些dll,我们可以解决此问题。