【java.lang.UnsatisfiedLinkError: 找不到指定的模块。】问题的解决
Java程序引用C写的DLL动态库,出现如下错误:【java.lang.UnsatisfiedLinkError: 找不到指定的模块。】网上查询有三种可能导致此错误。
一、JDK版本问题。JDK64位对应DLL文件64位,JDK32位对应DLL文件32位。我的DLL是32位的,Windows系统是64位的,安装了JDK64位的版本和JDK32位的版本(兼容性考虑)。运行Java程序是在32位JDK上面进行的,这点可以通过java -d32 -version命令来获得证实:
C:\Users\Andy>java -d32 -version java version "1.8.0_144" Java(TM) SE Runtime Environment (build 1.8.0_144-b01) Java HotSpot(TM) Client VM (build 25.144-b01, mixed mode)
如果当前Java是64位的JDK,上述命令会报错。
二、DLL路径有问题,比如绝对路径写错了。其实我引用DLL一直用相对路径,就是直接写DLL的文件名,然后把此DLL放到CLASSPATH之中,从来没出问题过。
因为此问题的出现,我改写成绝对路径,结果新的错误出来了:
Exception in thread "main" java.lang.UnsatisfiedLinkError: Unable to load library 'C:\Work\helloworld\WebContent\WEB-INF\classes\TEST.dll':
Native library (win32-x86/D:\Work\helloworld\WebContent\WEB-INF\classes\TEST.dll) not found in resource path
([file:/D:/Work/helloworld/WebContent/WEB-INF/classes/......)
更何况,绝对路径就是拷贝粘贴的事儿,几乎不会出错;甚至通过
System.out.println(System.getProperty("java.library.path"));
命令检测,将DLL放置于指定目录(比如说JDK的BIN目录),问题同样出现;所以,问题不在这儿。
三、DLL文件依赖问题。
可以用depends.exe工具检测DLL文件的相关依赖。下载地址(官网):http://www.dependencywalker.com/,可以选择下载安装32位版的,或者是64位版本的。
运行工具对DLL进行检测,发觉确实少了依赖包。
下载相关包安装即可。我这里,是安装【微软常用运行库合集-2021.04.07-X64.exe】,问题得到解决。