Windows,JNA:无法加载本机库 - UnsatisfiedLinkError

时间:2016-09-16 18:10:35

标签: java windows jna

我在 Windows 7 上使用 Java 7 ,并尝试使用Java JNA (Java Native Access)(4.2.2)[链接:https://github.com/java-native-access/jna]以提供对 C语言本机库的访问权限。我在Linux系统上完成了这项工作,并且在查找和加载库时没有任何问题。

我正在使用建议的技术将系统属性 jna.library.path 设置为库所在的路径。如上所述,这适用于Linux,但在Windows上我无法找到并加载库。

在Windows平台上,该库有32位和64位变体(我正在尝试使用32位),包含.lib和.dll文件。

我还建议将系统属性 jna.debug_load jna.debug_load.jna 设置为 true ,以观察JNA如何处理它的事情

我试过以下无济于事:

  • System.setProperty(“jna.library.path”,“C:\ Program Files (x86)\ VMware \ VMware VIX“);( Windows样式路径
  • System.setProperty( “jna.library.path”, “C:/ Program Files(x86)/ VMware / VMware VIX”); ( UNIX样式路径
  • 我将库放在一个没有空格的路径中。
  • 我在路径上添加了库名(带和不带文件扩展名)。例如。 “C:\ Program Files(x86)\ VMware \ VMware VIX \ VixAllProductsDyn”。 (VixAllProductsDyn.dll)

当我尝试时,我可以在Java控制台上看到调试信息。奇怪的是,它尝试了库文件所在位置的确切路径 - 但却找不到它

如果有人遇到这个并且对解决问题有所了解,那将非常感激。

Trying (via loadLibrary) jnidispatch
Looking in classpath from sun.misc.Launcher$AppClassLoader@1a1a7aa4 for /com/sun/jna/win32-x86-64/jnidispatch.dll
Found library resource at jar:file:/C:/Users/jo24447/.m2/repository/net/java/dev/jna/jna/4.2.2/jna-4.2.2.jar!/com/sun/jna/win32-x86-64/jnidispatch.dll
Trying C:\Users\jo24447\AppData\Local\Temp\jna--734724592\jna8544680981267090708.dll
Found jnidispatch at C:\Users\jo24447\AppData\Local\Temp\jna--734724592\jna8544680981267090708.dll
Looking for library 'VixAllProductsDyn'
Adding paths from jna.library.path: C:\Program Files (x86)\VMware\VMware VIX
Trying C:\Program Files (x86)\VMware\VMware VIX\VixAllProductsDyn.dll
Adding system paths: []
Trying C:\Program Files (x86)\VMware\VMware VIX\VixAllProductsDyn.dll
Looking for lib- prefix
Trying libVixAllProductsDyn.dll
Looking in classpath from sun.misc.Launcher$AppClassLoader@1a1a7aa4 for VixAllProductsDyn
Exception in thread "main" java.lang.UnsatisfiedLinkError: Unable to load library 'VixAllProductsDyn': Native library (win32-x86-64/VixAllProductsDyn.dll) not found in resource path ([file:/C:/Users/jo24447/luna_workspace/VMUtil/vm-util/target/classes/, file:/C:/Users/jo24447/.m2/repository/log4j/log4j/1.2.17/log4j-1.2.17.jar, file:/C:/Users/jo24447/.m2/repository/org/slf4j/slf4j-api/1.7.2/slf4j-api-1.7.2.jar, file:/C:/Users/jo24447/.m2/repository/org/slf4j/slf4j-log4j12/1.7.2/slf4j-log4j12-1.7.2.jar, file:/C:/Users/jo24447/.m2/repository/net/java/dev/jna/jna/4.2.2/jna-4.2.2.jar, file:/C:/Users/jo24447/.m2/repository/net/java/dev/jna/jna-platform/4.2.2/jna-platform-4.2.2.jar])
    at com.sun.jna.NativeLibrary.loadLibrary(NativeLibrary.java:277)
    at com.sun.jna.NativeLibrary.getInstance(NativeLibrary.java:403)
    at com.sun.jna.NativeLibrary.getInstance(NativeLibrary.java:342)
    at edu.mit.ll.oms.security.vm.VIXLibrary.<clinit>(VIXLibrary.java:24)
    at edu.mit.ll.oms.security.vm.test.QuickTest.main(QuickTest.java:16)

1 个答案:

答案 0 :(得分:0)

(1)尝试以下方法:

  1. 将两个窗口(64 / 32Bit)dll(以及.so&#39; s,如果您愿意的话)放入一个zip文件中,然后将文件重命名为.jar。
  2. 将该文件添加到您的应用程序类路径中。
  3. 现在,如果您的dll被命名为&#34; VixAllProductsDyn.dll&#34;然后调用loadLibrary,如下所示:Native.loadLibrary(&#34; VixAllProductsDyn&#34;,&#34; VixAllProductsDyn.class&#34;);
  4. (2)其次你尝试设置这样的路径: java -Djava.library.path = c:\ yourLocation VixAllProductsDyn

    (3)如果您有applet / webstart应用程序,则可以使用native lib属性指定本机库位置。

    (4)除此之外,您可以回答以下问题: 你的Windows系统有什么架构(32 / 64Bit)? 你的java有什么架构(32 / 64Bit)? 在这种情况下,您尝试运行的是什么版本的dll?

    也许您尝试了无效的系统架构/ JVM和库版本组合......

    <强>更新

    你能分享你的代码吗?看起来应该是这样的:

    VixAllProductsDyn lib = (VixAllProductsDyn) Native.loadLibrary("VixAllProductsDyn", VixAllProductsDyn.class);
    

    VixAllProductsDyn.java是一个包含您要使用的所有方法的接口:

    public interface VixAllProductsDyn extends Library {
    
        public abstract NativeLong OneOfTheMethodsYouWantToCall();
        ...
    }
    

    您确定要包含all所需的* .dlls和* .libs等吗?