当前位置: 首页 > 知识库问答 >
问题:

JNA:本机库依赖和JAR提取

卫烨烁
2023-03-14

我将通过JNA访问msp430.dll(参见此处)。但该库与其他本地库有依赖关系,这些本地库与MSP430.dll捆绑在一起。这个依赖的本机库称为hil.dll。使用jna.library.path后,所有的工作都非常出色。现在我会将本地库绑定到我自己的.jar包中。然后我将使用从JNA框架的jar自动加载本机库。但这会给具有依赖关系的本地库带来问题。如果我将msp430.dll和hil.dll打包到我的.jar包中,那么我会得到以下错误:“JNA java.lang.UnsatisfiedLinkError and the specified module could be found”。这意味着不可能解析msp430.dll与hil.dll的依赖关系。在我可以看到的JNA的调试输出中,只有msp430.dll将从.jar包中提取。在这种情况下,错误是可以理解的。在下一个试验中,我加载了显式的hil.dll,我可以看到hil.dll的提取,然后是MSP430.dll的提取。但我仍然得到来自JNA的模块错误。

我查看了提取方法的JNA代码。我看到JNA将本机库提取到系统临时目录,并在它们的临时目录中创建一个自己的临时目录。但现在我认为问题是,JNA为本机库的机智“JNA”前缀和唯一生成的数值创建临时文件。这里是JNA的输出:

Found library 'HIL.dll' at C:\Users\RD3\AppData\Local\Temp\jna-80961\jna1305152974718331988.dll

我认为MSP430.dll需要未重命名的hil.dll才能找到它。我有testet直接加载hil.dll,并将follows作为应用程序中的第一个调用

System.loadLibrary(C:\\absolutepath\\HIL.dll);

然后通过JNA from.jar包只加载MSP430.dll,这样工作没有问题。之后,我将hil.dll重命名为lol.dll,并使用以下调用:

System.loadLibrary(C:\\absolutepath\\lol.dll);

然后我再次从JNA获得模块错误。MSP430.dll无法解析重命名的hil.dll。

无论如何,将一个本地库打包到.jar包并加载JNA是可能的?

这里是通过JNA显式加载hil.dll的JNA调试输出:

C:\Users\RD3\Desktop>call "C:\Program Files (x86)\Java\jre1.8.0_25\bin\java.exe"
 -Djna.debug_load=true -jar C:\Data\Workspace\NetBeans\MspApiTest\target\MspApiTest-1.0.0-SNAPSHOT-jar-with-dependencies.jar
Looking in classpath from sun.misc.Launcher$AppClassLoader@1f96302 for /com/sun/jna/win32-x86/jnidispatch.dll
Found library resource at jar:file:/C:/Data/mstandfuss/Workspace/NetBeans/MspApiTest/target/MspApiTest-1.0.0-SNAPSHOT-jar-with-dependencies.jar!/com/sun/jna/win32-x86/jnidispatch.dll
Looking for library 'HIL.dll'
Adding paths from jna.library.path: null
Trying HIL.dll
Adding system paths: []
Trying HIL.dll
Looking for lib- prefix
Trying libHIL.dll
Looking in classpath from sun.misc.Launcher$AppClassLoader@1f96302 for HIL.dll
Found library resource at jar:file:/C:/Data/mstandfuss/Workspace/NetBeans/MspApiTest/target/MspApiTest-1.0.0-SNAPSHOT-jar-with-dependencies.jar!/win32-x86/HIL.dll
Found library 'HIL.dll' at C:\Users\RD3\AppData\Local\Temp\jna-80961\jna1305152974718331988.dll
Looking for library 'MSP430.dll'
Adding paths from jna.library.path: null
Trying MSP430.dll
Adding system paths: []
Trying MSP430.dll
Looking for lib- prefix
Trying libMSP430.dll
Looking in classpath from sun.misc.Launcher$AppClassLoader@1f96302 for MSP430.dll
Found library resource at jar:file:/C:/Data/mstandfuss/Workspace/NetBeans/MspApi
Test/target/MspApiTest-1.0.0-SNAPSHOT-jar-with-dependencies.jar!/win32-x86/MSP430.dll
Exception in thread "main" java.lang.UnsatisfiedLinkError: Das angegebene Modul wurde nicht gefunden.

        at com.sun.jna.Native.open(Native Method)
        at com.sun.jna.Native.open(Native.java:1759)
        at com.sun.jna.NativeLibrary.loadLibrary(NativeLibrary.java:260)
        at com.sun.jna.NativeLibrary.getInstance(NativeLibrary.java:398)
        at com.sun.jna.Library$Handler.<init>(Library.java:147)
        at com.sun.jna.Native.loadLibrary(Native.java:412)
        at com.sun.jna.Native.loadLibrary(Native.java:391)
        at de.sitec.jmspflash.Msp430Native.<clinit>(Msp430Native.java:22)
        at de.sitec.jmspflash.Msp430Impl.init(Msp430Impl.java:50)
        at de.sitec.jmspflash.Msp430Impl.createMsp430Impl(Msp430Impl.java:36)
        at de.sitec.mspapitest.App.main(App.java:34)

C:\Users\RD3\Desktop>

最诚挚的问候

共有1个答案

夏侯阳
2023-03-14

假设您遇到的唯一问题是依赖库的名称,请参阅native.extractFromResourcePath()。您可以使用它提取非显式依赖项,并使用file.rename()确保库具有所需的名称。

 类似资料:
  • 我通常使用加载一个DLL。但是我想它不是这样工作的,因为我把这个函数调用分配给了实例成员。

  • 我目前正在尝试将一个通过RFC连接到SAP系统的旧Java EE解决方案迁移到Quarkus。由于项目使用maven,我再次面临sapjco3的问题。来自SAP的jar库,防止该库被重命名。如果我像那样添加库作为依赖项 它将被添加到lib目录中,名称为com.sap.sapjco3-3.1.jar.不幸的是,最终以异常结束 JAVAlang.ExceptionInInitializerError:

  • 我想用Java将一个文件放入Windows中的回收站。以便用户能够还原它。

  • 我正在Java使用Eclipse Juno IDE制作数学反射游戏。根据我已经做过的研究,IDE在保存时将所有内容编译成文件字节码!现在的问题是,我已经尝试从Windows机器中提取JAR的所有内容,并将JAR交给一些beta测试人员。测试人员在试图从Linux访问时报告了问题 /Mac.我还知道,一个可运行的JAR(我所提取的一切)基本上是一个经过美化的ZIP压缩文件,其中包含JVM理解和执行的

  • Package dependencies are critical to the success of a package. When you develop the functionality of your package, you will very likely use existing code defined in other packages. Those packages then

  • 我的java项目使用javax.mail.jar。因此,在netbeans中,我创建了一个新的文件夹库,将jar文件复制到那里,并将其添加到项目属性中。我将这个文件夹添加到git中,它在NetBeans上运行良好。但当我在另一台机器上使用ant构建项目并运行项目jar时 我不确定哪里出了问题。知道怎么让它运行吗? 解决方案:正如@Gimby所指出的,来自Netbeans和ant build的jar