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

时间:2016-04-06 13:26:30

标签: java netbeans jar jna

我正在使用JNA在NetBeans中开发Java项目。根据{{​​3}},我可以通过将它放在jar中来使我的DLL可用于Java:

  

在路径name下的类路径中提供本机库,其中{OS}-{ARCH}/{LIBRARY}是JNA本机库的规范前缀(例如{OS}-{ARCH}win32-x86或{ {1}})。如果资源在jar文件中,它将在加载时自动解压缩。

这就是我想要做的,所以我在linux-amd64下的项目中包含了DLL:s。如果我用netbeans构建一个jar文件,然后在另一个项目中包含jar文件,一切正常,JNA找到我的库没有问题。这就是我在darwin上获得的内容:

src/win32-x86-64

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

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

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

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

这是什么问题?为什么JNA不提取文件?我该如何解决这个问题?

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

编辑:找到UnsatisfiedLinkError似乎没有问题。根据{{​​1}}设置为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 时的输出,该文件在JAR中找到并提取到临时文件夹。

1 个答案:

答案 0 :(得分:2)

JNA显示错误" UnsatisfiedLinkError"什么时候dll无法加载。如果您的DLL需要系统路径中不存在的另一个自定义DLL,它将失败,因为JNA不会自动提取此DLL。

JNA作为Java库并不知道系统库的依赖性,因此它无法从jar中提取。 解决方案是指定JNA Java接口中的所有依赖项。

您可以在此处查看示例Load multiple dependent libraries with JNA

操作系统幕后发生了什么

最后,操作系统根据主可执行文件的请求加载库。在这种情况下,主要可执行文件是java.exe或(jvm.dll)。如果系统无法在路径中找到它失败的库,则java会生成异常。

另一个相关且已解决的问题是Registering multiple .dll libraries into a single java class using JNA