jar调用dll文件提示找不到指定的模块Unable to load library | 您所在的位置:网站首页 › java运行文件找不到 › jar调用dll文件提示找不到指定的模块Unable to load library |
目录 问题描述 解决方案一 解决方案二 效果 补充说明 参考链接 问题描述在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 实验室设备网 版权所有 |