Java JNA:本机库依赖项和JAR提取

Java JNA:本机库依赖项和JAR提取,java,dll,jar,dependencies,jna,Java,Dll,Jar,Dependencies,Jna,我将通过JNA访问MSP430.dll(参见此处)。但该库依赖于其他本机库,它与MSP430.dll捆绑在一起。此依赖的本机库称为HIL.dll。通过使用jna.library.path,所有这些都可以完美地工作。现在,我将本地库打包到我自己的.jar包中。然后,我将使用从JNA框架的jar自动加载本机库。但这会给具有依赖关系的本地库带来问题。如果我将MSP430.dll和HIL.dll打包到.jar包中,则会出现以下错误:“JNA java.lang.unsatifiedlinkerror,无

我将通过JNA访问MSP430.dll(参见此处)。但该库依赖于其他本机库,它与MSP430.dll捆绑在一起。此依赖的本机库称为HIL.dll。通过使用jna.library.path,所有这些都可以完美地工作。现在,我将本地库打包到我自己的.jar包中。然后,我将使用从JNA框架的jar自动加载本机库。但这会给具有依赖关系的本地库带来问题。如果我将MSP430.dll和HIL.dll打包到.jar包中,则会出现以下错误:“JNA java.lang.unsatifiedlinkerror,无法找到指定的模块”。这意味着,无法将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来查找它。我已经测试了直接加载HIL.dll,在应用程序中的第一个调用是

System.loadLibrary(C:\\absolutepath\\HIL.dll);
然后通过JNA从.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>
C:\Users\RD3\Desktop>调用“C:\ProgramFiles(x86)\Java\jre1.8.0\u 25\bin\Java.exe”
-Djna.debug_load=true-jar C:\Data\Workspace\NetBeans\MspApiTest\target\MspApiTest-1.0.0-SNAPSHOT-jar-with-dependencies.jar
从sun.misc.Launcher查看类路径$AppClassLoader@1f96302for/com/sun/jna/win32-x86/jnidispatch.dll
在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
正在查找库“HIL.dll”
从jna.library.path添加路径:null
正在尝试HIL.dll
正在添加系统路径:[]
正在尝试HIL.dll
查找lib-prefix
正在尝试libHIL.dll
从sun.misc.Launcher查看类路径$AppClassLoader@1f96302对于HIL.dll
在jar:file:/C:/Data/mstandfuss/Workspace/NetBeans/MspApiTest/target/MspApiTest-1.0.0-SNAPSHOT-jar-with-dependencies.jar找到库资源/win32-x86/HIL.dll
在C:\Users\RD3\AppData\Local\Temp\jna-80961\jna1305152974718331988.dll中找到库“HIL.dll”
正在查找库“MSP430.dll”
从jna.library.path添加路径:null
正在尝试MSP430.dll
正在添加系统路径:[]
正在尝试MSP430.dll
查找lib-prefix
正在尝试libMSP430.dll
从sun.misc.Launcher查看类路径$AppClassLoader@1f96302对于MSP430.dll
在jar:file:/C:/Data/mstandfuss/Workspace/NetBeans/MspApi找到库资源
Test/target/MspApiTest-1.0.0-SNAPSHOT-jar-with-dependencies.jar/win32-x86/MSP430.dll
线程“main”java.lang.UnsatisfiedLinkError中出现异常:Das angegebene module wurde nicht gefunden。
位于com.sun.jna.Native.open(本机方法)
位于com.sun.jna.Native.open(Native.java:1759)
位于com.sun.jna.nativellibrary.loadLibrary(nativellibrary.java:260)
位于com.sun.jna.nativellibrary.getInstance(nativellibrary.java:398)
位于com.sun.jna.Library$Handler。(Library.java:147)
位于com.sun.jna.Native.loadLibrary(Native.java:412)
位于com.sun.jna.Native.loadLibrary(Native.java:391)
位于de.sitec.jmspflash.Msp430Native。(Msp430Native.java:22)
位于de.sitec.jmspflash.Msp430Impl.init(Msp430Impl.java:50)
位于de.sitec.jmspflash.Msp430Impl.createMsp430Impl(Msp430Impl.java:36)
位于de.sitec.mspapitest.App.main(App.java:34)
C:\Users\RD3\Desktop>

致以最诚挚的问候

假设您遇到的唯一问题是相关库的名称,请参阅。您可以使用它来提取非显式依赖项,并使用
File.rename()
来确保库具有您想要的名称。

有确切的问题,建议对我有效