【发布时间】:2015-01-07 22:26:12
【问题描述】:
我将通过 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 的 testet,并在应用程序中进行第一次调用
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>
最好的问候
【问题讨论】:
标签: java dll jar dependencies jna