【发布时间】:2016-04-06 13:26:29
【问题描述】:
我正在使用 JNA 在 NetBeans 中开发一个 Java 项目。根据JNA documentation,我可以通过将我的 DLL:s 放入 jar 中来使其对 Java 可用:
使您的本机库在您的类路径中可用,在路径
{OS}-{ARCH}/{LIBRARY}下,其中{OS}-{ARCH}是 JNA 的本机库规范前缀(例如win32-x86、linux-amd64或darwin)。如果资源在 jar 文件中,加载时会自动提取。
这就是我想做的,所以我在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 中找到该文件并解压缩到临时文件夹。
【问题讨论】: