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

2023-12-03

我将通过 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>

此致


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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

JNA:本机库依赖项和 JAR 提取 的相关文章

随机推荐

  • 当控制台输出重定向到文本框时,会发生跨线程操作[重复]

    这个问题在这里已经有答案了 总的来说 我对 C 和 GUI 开发还很陌生 如果这是一个老问题 请引导我找到该来源 我将删除这个问题 我的情况 因此 我正在编写一个 GUI 它将一个函数的控制台输出重定向到 Windows 应用程序表单中的文
  • 后台处理程序在jetpack compose中不起作用

    嘿我正在使用 BackHandler堆栈溢出 当我按下后退按钮时 它不起作用 有人可以指导我吗 结果屏幕 kt Composable fun ResultScreen navController NavHostController near
  • C# 中的元帅“char *”

    给定 DLL 中的以下 C 函数 char GetDir char path 您如何将这个函数 P Invoke 到 C 中并正确封送 char NET 似乎知道如何执行 LPCTSTR 但是当我无法找出任何不会导致调用此函数时引发 Not
  • 如何提供overlayfs的嵌套挂载

    我尝试将overlayfs的层安装为下一个overlayfs的下层 但是在两层之后它崩溃了 mount t overlayfs o rw lowerdir tmp test layers centos5 6 layer0 lower upp
  • Matplotlib:关闭轴并同时设置面部颜色不可能吗?

    有人可以解释为什么这个简单的代码在设置轴关闭时不会执行facecolor命令吗 fig plt figure 1 ax fig add subplot 211 facecolor 0 0 0 aspect equal ax scatter
  • PHP可以根据版本切换吗?

    我的 PHP 脚本之一中有一个函数依赖于 5 3 版本来运行 我认为如果它所在的函数在 PHP 5 2 或更早版本的服务器上运行时没有被调用 那么它就会被忽略 然而 事实证明 当该脚本及其内部的类被包含时 PHP 就会退出并停止执行 如果我
  • 以闪亮的方式显示本地驱动器中的pdf

    我对 r 和闪亮还是个新手 我对原本应该是简单的逻辑感到困惑 我试图在 imageOutput 小部件中显示 pdf 文件 但没有成功 有人可以引导我走向正确的方向吗 示例 ui R shinyUI pageWithSidebar main
  • WordPress - 以编程方式在页面中插入 Elementor 小部件

    我在我的 WordPress 网站上安装了 Elementor Pro 并且正在编写一个自定义插件 该插件将执行一些操作并以编程方式创建一个新页面 我能够创建页面 但问题是 我想以编程方式在这个新页面中插入 Elementor Widget
  • 使用 PHP 将文本文件行转换为数组

    如何使用 PHP 将文本文件的行放入数组中 谢谢 array file filename txt
  • 无法使用“knitr”中的“beamer_presentation”选项交叉引用图形和表格

    为什么 ref 符号无法与投影仪演示一起操作 下面的问题可能会提醒您在编写PDF文档时交叉引用的一些问题 例如 this 但是当我进行投影仪演示时 答案中介绍的方法对我没有帮助 现在我很困惑因为 ref fig label to refer
  • r 中向量内的数字相加

    我有一个向量 v lt c 1 2 3 我需要按以下方式添加向量中的数字 1 1 2 1 2 3 产生第二个向量 v1 lt c 1 3 6 这可能很简单 但我有点卡住了 使用累积和函数 cumsum v 1 1 3 6
  • 在 PHP 中访问对象成员

    我正在 PHP 中调用 WCF 服务 它返回以下内容 我调用的服务返回 C 结构 object stdClass 70 1 SiteInterop CreateContactAndOpportunityResult gt object st
  • 使用 Restful API 进行 Birt

    我正在为 PHP 项目开发 BIRT 报告 我可以通过使用 JDBC 数据源直接连接到数据库来轻松开发报告 然而 某些数据来自 Restful api 我无法从这些 api 端点创建数据源 Birt 可以选择从 Web 服务创建数据源 但这
  • ArrayBufferView 构造函数中的奇怪限制[重复]

    这个问题在这里已经有答案了 The TypedArray 规范声明可以通过以下方式创建 ArrayBufferView TypedArray ArrayBuffer buffer optional unsigned long byteOff
  • 如何在 C 中封装这样的函数?

    我想写一个结构体来封装一些函数 如下所示 typedef struct Operate void op fun size t result type unsigned int arg count size t arg type Operat
  • Spring Data Rest 中的 @OneToMany stackoverflow

    我有一个问题实体 其选项列表如下 OneToMany mappedBy question List
  • 如何在 es6 javascript 类中使用 async/await?

    所以我试图为我创建的类创建一个异步函数 但是 webpack 在编译该类时给了我一个错误 我的代码将是这样的 class MyClass constructor apiService this apiService apiService a
  • 如何解析多维参数的url参数?

    我使用 python 3 并且需要将请求 uri 参数转换为字典 我的示例网址是 http example com item test1 foo abc 0 6 foo 在 PHP 中 GET获取具有多维数组的字典 如下所示 Array i
  • R中的parent.frame()和parent.env()有什么区别;它们在引用调用方面有何不同?

    如果有人可以用一个简单的例子来说明这一点 那会有帮助吗 另外 什么地方有用parent frame 代替parent env 反之亦然 parent env是定义闭包 例如函数 的环境 parent frame是调用闭包的环境 f func
  • JNA:本机库依赖项和 JAR 提取

    我将通过 JNA 访问 MSP430 dll 请参阅此处 但该库依赖于与 MSP430 dll 捆绑在一起的其他本机库 这个依赖的本机库称为 HIL dll 使用 jna library path 一切都可以完美工作 现在我会将本机库捆绑到