jar调用dll文件提示找不到指定的模块Unable to load library 您所在的位置:网站首页 java运行文件找不到 jar调用dll文件提示找不到指定的模块Unable to load library

jar调用dll文件提示找不到指定的模块Unable to load library

2023-09-02 23:17| 来源: 网络整理| 查看: 265

目录

问题描述

解决方案一

解决方案二

效果

补充说明

参考链接

问题描述

在Windows系统上,自己开发的需要使用JNA调用动态链接库dll文件的Swing项目(Java简易系统监视器system-monitoring)使用maven-assembly-plugin(jar-with-dependencies)打成jar包后,本机可以正常运行,但是换一台电脑就运行不了了,提示:java.lang.UnsatisfiedLinkError: Unable to load library 'BatteryMonitor': 找不到指定的模块。

但是,BatteryMonitor.dll文件明明就在眼前,而且就算换成绝对路径也会报错,再者就算通过Java命令手动将dll文件塞进JNA的win32-x86-64文件夹中也不行。(绝望了,世界上最遥远的距离,就是,我明明在你眼前,你却看不见……)

完整报错信息:

java.lang.UnsatisfiedLinkError: Unable to load library 'BatteryMonitor': 找不到指定的模块。 找不到指定的模块。 找不到指定的模块。 Can't obtain InputStream for win32-x86-64/BatteryMonitor.dll at com.sun.jna.NativeLibrary.loadLibrary(NativeLibrary.java:302) at com.sun.jna.NativeLibrary.getInstance(NativeLibrary.java:455) at com.sun.jna.Library$Handler.(Library.java:192) at com.sun.jna.Native.load(Native.java:596) at com.sun.jna.Native.load(Native.java:570) at cxzgwing.dll.Dll.(Dll.java:7) at cxzgwing.utils.AppUtil.getBatteryPercent(AppUtil.java:37) at cxzgwing.Window.initBatteryJLabel(Window.java:130) at cxzgwing.Window.(Window.java:62) at cxzgwing.App.main(App.java:8) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) at java.lang.reflect.Method.invoke(Unknown Source) at com.exe4j.runtime.LauncherEngine.launch(LauncherEngine.java:85) at com.exe4j.runtime.WinLauncher.main(WinLauncher.java:94) Suppressed: java.lang.UnsatisfiedLinkError: 找不到指定的模块。 at com.sun.jna.Native.open(Native Method) at com.sun.jna.NativeLibrary.loadLibrary(NativeLibrary.java:191) ... 15 more Suppressed: java.lang.UnsatisfiedLinkError: 找不到指定的模块。 at com.sun.jna.Native.open(Native Method) at com.sun.jna.NativeLibrary.loadLibrary(NativeLibrary.java:204) ... 15 more Suppressed: java.lang.UnsatisfiedLinkError: 找不到指定的模块。 at com.sun.jna.Native.open(Native Method) at com.sun.jna.NativeLibrary.loadLibrary(NativeLibrary.java:265) ... 15 more Suppressed: java.io.IOException: Can't obtain InputStream for win32-x86-64/BatteryMonitor.dll at com.sun.jna.Native.extractFromResourcePath(Native.java:1115) at com.sun.jna.NativeLibrary.loadLibrary(NativeLibrary.java:276) ... 15 more

 

解决方案一

参考Github上的JNA的文档Setting up a Windows Development Environment,Prerequisites中有4点,每一点都涉及到一个需要安装的环境或者程序等。

 

解决方案二

直接安装Visual Studio,勾选“使用C++的桌面开发”和“通用Windows平台开发”,然后安装,安装好后就可以了。(猜测:这两个模块中包含JNA所需要的环境)

 上图是我在安装Visual Studio Community 2022 时,一开始只勾选了“通用Windows平台开发”,运行程序后发现还是报错,然后点击了安装界面中的“修改”按钮,再勾选了“使用C++的桌面开发”。其实可以一开始安装的时候就勾选这两个模块。(分开安装是为了测试最少需要安装的模块)

效果

安装好VS2022后,再运行我的system-monitoring就没问题了。

补充说明

因为这个dll文件是我自己写的(Java调用dll文件),本机也安装了VS2022 Community,所以本机是可以运行的,但是发给小伙伴后,发现运行不了,然后自己在虚拟机上也安装了win10系统,在干干净净的win10环境下运行也发现有同样的问题。然后网上找了各种资料,都没有解决,最后想着,直接去看官方文档,看有没有什么启发,结果就发现了这个宝藏教程(保姆教程)。

仔细一看,发现Prerequisites里面第一点是Install "Visual Studio Community 2019" or the "Build Tools for Visual Studio 2019",然后再仔细回想,好像我之前已经安装了Visual Studio(为了自己写dll),那应该是“阴差阳错”的安装了JNA所需的环境,于是就在虚拟机中亲自测试了一番解决方法二,总结出这篇经验。

解决方法一中的内容暂未亲测,官方文档,问题应该不大。因嫌麻烦我就没去一点点安装环境了,直接上手Visual Studio。

参考链接

[1] java-native-access.Setting up a Windows Development Environment.2021-01-18 04:13 https://github.com/java-native-access/jna/blob/master/www/WindowsDevelopmentEnvironment.md



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有