我有教程 中的 NetBeans 项目导致异常:
线程“main” java.lang.UnsatisfiedLinkError: Unable to load library
“simpleDLL”中的异常:找不到指定的模块。
试图将 simpleDLL.dll 放入项目库中,将文件复制到 system32 文件夹中,但没有成功。
我在加载 DLL 时遇到了完全相同的问题,我以这种方式解决了它:
正如 Christian Kuetbach 所说,检查您使用的 simpleDLL 是否与您的处理器架构兼容,32 位 DLL 无法在 64 位机器上运行,64 位 DLL 也无法在 32-位机。
如果 DLL 是兼容的,那么问题可能出在您的 java 库路径中。我将我的 DLL 放入user.dir
目录中,然后使用以下代码:
将 Java 库路径设置为user.dir
或您想要的另一个路径:
String myLibraryPath = System.getProperty("user.dir");//or another absolute or relative path
System.setProperty("java.library.path", myLibraryPath);
加载库:
System.loadLibrary("libraryWithoutDLLExtension");
它对我有用,试一试并告诉我它是否对你有用。
请检查 simpleDLL 是 32 位还是 64 位。然后检查 JVM 是 32 位还是 64 位。它们必须用于同一个平台。
您也可以指定绝对路径,如果您更改loadLibrary()
为load()
:
http: //www.chilkatsoft.com/p/p_499.asp
我只能在 32 位 (Xp) 中运行。
将 DLL 放在文件夹“c:\Windows\System32”中
helloWorldDLL lib = (helloWorldDLL) Native.loadLibrary("helloworldDLL", helloWorldDLL.class);
如果错误 java.lang.UnsatisfiedLinkError: Unable to load library" 仍然存在,请使用 Dependency Walker 查看依赖的 DLL。
如果 dll 文件未损坏,则此问题的三个可能原因:
32 位 64 位兼容性。32 位 dll 只能在 32 位 jdk 或 jre 上运行。通过使用 Cygwin 命令file <filename>
,我们可以判断 dll 是 32 位还是 64 位。
dll 没有放在正确的路径中,因此 java 无法找到它。一般来说,我们可以使用一些绝对路径,而不是System32
确保路径是正确的。
我们正在加载的 dll 需要其他 dll。
我们如何处理第三种可能性:
System.loadLibrary()
与 JNA 相比,使用 JNI 的方法可以给我更多的提示。它可能会这样说:这意味着缺少Exception in thread "main" java.lang.UnsatisfiedLinkError: MyLibrary.dll: Can't find dependent libraries.
某些库依赖。MyLibrary.dll
通过使用依赖遍历器 ,我们可以知道需要哪些 dll。
通过在我们要加载的dll之前加载这些dll,我们可以解决这个问题。
有同样的问题,出于某种原因,即使 dll 文件名有大写字母,您也必须使用所有小写字母来加载它,如下所示:
Native.loadLibrary("dlls/library.dll", YourInterface.class)
不是这个:Native.loadLibrary("dlls/Library.dll", YourInterface.class)