【问题标题】:How to get JNA to extract several DLL files from a jar file?如何让 JNA 从 jar 文件中提取多个 DLL 文件?
【发布时间】:2016-04-06 13:26:29
【问题描述】:

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

使您的本机库在您的类路径中可用,在路径 {OS}-{ARCH}/{LIBRARY} 下,其中 {OS}-{ARCH} 是 JNA 的本机库规范前缀(例如 win32-x86linux-amd64darwin)。如果资源在 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 中找到该文件并解压缩到临时文件夹。

【问题讨论】:

    标签: java netbeans jar jna


    【解决方案1】:

    当 dll 无法加载时,JNA 显示错误“UnsatisfiedLinkError”。如果您的 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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-10-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多