2

我正在尝试使用 JNA 从我的 Java 应用程序中调用 .dll 文件。我收到以下异常:

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

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

我正在使用 Eclipse,并已将 System32 文件夹添加到 Java Build Path Properties 中的 Libraries 选项卡下 JRE System 库中的 Native 库位置(尽管我认为这不是必需的)。

我将不胜感激任何帮助或建议。
谢谢,
-蒙克。

4

4 回答 4

1

这取决于文件系统重定向器。您在模拟 64 位系统上的 32 位 Windows 的 WOW64 模拟器下执行。在 WOW64 下,system32被重定向到SysWOW64. 你需要把你的DLL放在那里。

话虽如此,系统目录归系统所有,并且是系统私有的。您不应将 DLL 放入系统目录。您应该找到一种方法将您的 DLL 放在其他位置。

于 2013-07-17T11:45:11.737 回答
0

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

于 2013-07-17T11:57:12.663 回答
0

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

于 2016-01-14T03:09:58.567 回答
0

Three possible reasons for this issue, if the dll file is not broken:

  1. 32 bit 64 bit Compatibility. 32bit dll can only be running on a 32bit jdk or jre. By using Cygwin command file <filename> we can tell if a dll is 32bit or 64bit.

  2. the dll is not lacated in the right path, so java cannot locate it. Generally speaking we can use some absolut path other than System32 to ensure that the path is right.

  3. the dll that we are loading is requires other dlls.

How can we handle the 3rd possibility:

  1. using JNI's System.loadLibrary() mthod can give me more hint, compared with JNA. It may says something like: Exception in thread "main" java.lang.UnsatisfiedLinkError: MyLibrary.dll: Can't find dependent libraries. It means some libraries MyLibrary.dll depends is missing. By using dependency walker we can tell what dlls are needed.

  2. By loading these dlls before the dll that we want to load, we can solve this issue.

于 2018-12-04T01:36:16.477 回答