尝试使用Java(JNA)中的DLL。无法加载库异常

时间:2013-01-11 21:07:01

标签: java dll jna

我有tutorial的NetBeans项目导致异常:

线程“main”java.lang.UnsatisfiedLinkError: Unable to load library'simpleDLL'中的异常:找不到指定的模块。

试图将simpleDLL.dll放在项目库中,将文件复制到system32文件夹中但没有成功。

5 个答案:

答案 0 :(得分:12)

我在加载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”);

它适用于我,尝试并告诉我它是否适合你。

答案 1 :(得分:5)

请检查simpleDLL是32位还是64位。然后检查,如果JVM也是32位或64位。他们必须是同一个平台。

如果您将loadLibrary()更改为load(),您还可以指定绝对路径: http://www.chilkatsoft.com/p/p_499.asp

答案 2 :(得分:2)

我只能在32位(Xp)下运行。

将DLL放在文件夹" c:\ Windows \ System32"

  

helloWorldDLL lib =(helloWorldDLL)   Native.loadLibrary(" helloworldDLL",helloWorldDLL.class);

如果错误java.lang.UnsatisfiedLinkError:无法加载库"持久化,使用Dependency Walker查看依赖的DLL。

Dependency Walker

答案 3 :(得分:1)

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

  1. 32位64位兼容性。 32位dll只能在32位jdk或jre上运行。 通过使用Cygwin命令>>> class A: >>> def __eq__(self, other): >>> return True >>> >>> a = A() >>> a == True True >>> a == False True >>> a == "foobar" True >>> a != "foobar" True ,我们可以确定dll是32位还是64位。

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

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

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

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

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

答案 4 :(得分:0)

有相同的问题,并且由于某些原因,即使dll文件名具有大写字母,也必须使用所有小写字母加载它,如下所示: Native.loadLibrary("dlls/library.dll", YourInterface.class)

Native.loadLibrary("dlls/Library.dll", YourInterface.class)