有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java如何让JNA从jar文件中提取几个DLL文件?

我正在使用JNA在NetBeans中开发一个Java项目。根据JNA documentation,我可以通过将DLL:s放入jar中,使其可用于Java:

Make your native library available on your classpath, under the path {OS}-{ARCH}/{LIBRARY}, where {OS}-{ARCH} is JNA's canonical prefix for native libraries (e.g. win32-x86, linux-amd64, or darwin). If the resource is within a jar file it will be automatically extracted when loaded.

这就是我想要做的,所以我在src/win32-x86-64下的项目中包含了DLL:s。如果我用netbeans构建一个jar文件,然后将该jar文件包含在另一个项目中,那么一切都会正常工作,JNA会毫无问题地找到我的库。这就是我从jna.debug_load上得到的:

Looking in classpath from sun.misc.Launcher$AppClassLoader@15db9742 for /com/sun/jna/win32-x86-64/jnidispatch.dll
Found library resource at jar:file:/C:/MyNetBeansProject/dist/lib/jna-4.2.2.jar!/com/sun/jna/win32-x86-64/jnidispatch.dll
Looking for library 'MyLibrary'
Adding paths from jna.library.path: null
Trying MyLibrary.dll
Adding system paths: []
Trying MyLibrary.dll
Looking for lib- prefix
Trying libMyLibrary.dll
Looking in classpath from sun.misc.Launcher$AppClassLoader@15db9742 for MyLibrary
Found library resource at file:/C:/MyNetBeansProject/build/classes/win32-x86-64/MyLibrary.dll
Looking in C:/MyNetBeansProject/build\classes\win32-x86-64\MyLibrary.dll
Found library 'MyLibrary' at C:/MyNetBeansProject/build\classes\win32-x86-64\MyLibrary.dll

显然没有使用jar中的DLL。而是使用构建文件夹中的DLL

现在,如果我将jar文件移动到另一个文件夹,并将其包含在我的项目中,我会得到一个UnsatisfiedLinkError。JNA给出了以下输出:

Looking in classpath from sun.misc.Launcher$AppClassLoader@70dea4e for /com/sun/jna/win32-x86-64/jnidispatch.dll
Found library resource at jar:file:/C:/SomeFolder/lib/jna-4.2.2.jar!/com/sun/jna/win32-x86-64/jnidispatch.dll
Looking for library 'MyLibrary'
Adding paths from jna.library.path: null
Trying MyLibrary.dll
Adding system paths: []
Trying MyLibrary.dll
Looking for lib- prefix
Trying libMyLibrary.dll
Looking in classpath from sun.misc.Launcher$AppClassLoader@70dea4e for MyLibrary
Found library resource at jar:file:/C:/SomeFolder/MyNetBeansProject.jar!/win32-x86-64/MyLibrary.dll

看起来JNA在jar中找到了DLL,但它没有尝试提取它。我在我的临时文件夹中找不到它(JNA在其中提取它自己的内部DLL)

这里有什么问题?为什么JNA不提取文件?我该怎么解决这个问题

(我不知道这是否相关,但我应该指出,我的DLL依赖于jar中同一文件夹中的多个其他DLL文件。不确定JNA是否会自动为我提取它们,但到目前为止,JNA似乎甚至没有提取我实际使用的DLL。)

编辑:定位jnidispatch.dll似乎没有问题。根据jna.debug_load.jna设置为true时的输出,在JAR中找到文件,并将其解压缩到临时文件夹


共 (0) 个答案