我在 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如何处理它的事情
我试过以下无济于事:
当我尝试时,我可以在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)
答案 0 :(得分:0)
(1)尝试以下方法:
(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等吗?