我将通过 JNA 访问 MSP430.dll(请参阅此处)。但该库依赖于与 MSP430.dll 捆绑在一起的其他本机库。这个依赖的本机库称为 HIL.dll。使用 jna.library.path 一切都可以完美工作。现在我会将本机库捆绑到我自己的 .jar 包中。然后我将使用从 JNA 框架的 jar 中自动加载本机库。但这会给具有依赖关系的本机库带来问题。如果我将 MSP430.dll 和 HIL.dll 打包到我的 .jar 包中,则会出现以下错误:“JNA java.lang.UnsatisfiedLinkError 且找不到指定的模块”。这意味着无法解决 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>
此致