我正在使用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中找到并提取到临时文件夹。
答案 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