首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >JNA:本地库依赖项和JAR提取

JNA:本地库依赖项和JAR提取
EN

Stack Overflow用户
提问于 2015-01-08 06:26:12
回答 1查看 3.7K关注 0票数 3

我将通过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的输出:

代码语言:javascript
复制
Found library 'HIL.dll' at C:\Users\RD3\AppData\Local\Temp\jna-80961\jna1305152974718331988.dll

我认为MSP430.dll需要未重命名的HIL.dll才能找到它。我有测试直接加载的HIL.dll与以下作为应用程序中的第一个调用

代码语言:javascript
复制
System.loadLibrary(C:\\absolutepath\\HIL.dll);

然后只从.jar包中通过JNA加载MSP430.dll,这是没有问题的。之后,我将HIL.dll重命名为lol.dll,并使用此调用:

代码语言:javascript
复制
System.loadLibrary(C:\\absolutepath\\lol.dll);

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

无论如何都可以打包一个依赖于.jar包并使用JNA加载的本地库?

下面是通过JNA显式加载HIL.dll的JNA调试输出:

代码语言:javascript
复制
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>

诚挚的问候

EN

回答 1

Stack Overflow用户

发布于 2015-01-08 12:23:36

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

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27829764

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档