Exception in thread "main" java.lang.UnsatisfiedLinkError: Unable to load library 'dll.msvcrt'

上网找了一下方法,说是jdk64的问题,也有说是路径不对问题。

代码片段

1 public interface CLibrary extends Library {
2     CLibrary INSTANCE = (CLibrary) Native.loadLibrary("dll\\msvcrt",
3                 CLibrary.class);//第二个参数是本接口的Class类型。JNA通过这个Class类型,
//根据指定的.dll/.so文件,动态创建接口的实例。该实例由JNA通过反射自动生成。
4 void printf(String format, Object... args); 5 }

在看到以下文章之后,觉得loadLibrary()加载时顺序是从当前目录下找到,没找到,这去项目根目录下找win32/win64文件夹,找到再找其中的dll文件,

没有找到,就到windows/system32下寻找。

其中当前目录下验证成功, windows/system32成功,去项目根目录下找win32/win64文件夹没有成功。

 

这里面的知识点还是挺多的,

首先需要确定一点,各个版本需要完全对应,msvcrt.dll  应该是32位的,然后,jdk需要也是32位,

Native.loadLibrary("msvcrt", Clibrary.class);   意思为,动态加载msvcrt.dll文件,利用反射动态地创建CLibrary对象, 然后返回给INSTANCE, 

这里面设计到连个问题,一个加载dll文件的路径问题,一个加载dll文件的方法问题,

1. 加载dll文件的方法

System.load("D:\\workspace\\TestDll\\TestDLL.dll");//absolutePath绝对路径

System.loadLibrary("TestDLL");  // 使用 dll的名称, 底层会根据System.getProperty("java.library.path");自动寻找  TestDLL.dll文件,

这里System.getProperty("java.library.path")的值为通过initializePath(usr_paths = initializePath("java.library.path"))方法付给user_paths[ ]了,

一般为

D:\tool\Java\jdk1.6.0_45x86\bin;
C:\Windows\system32;
C:\Windows;
D:/tool/myeclipse/Genuitec/Common/binary/com.sun.java.jdk.win32.x86_1.6.0.013/jre/bin/client;
D:/tool/myeclipse/Genuitec/Common/binary/com.sun.java.jdk.win32.x86_1.6.0.013/jre/bin;

D:\tool\Java\jdk1.6.0_45\bin;
D:\tool\Java\jdk1.6.0_45\jre\bin;
;
.

所以这就是有些人把TestDLL.dll放到C:\Windows\system32下,系统也能够找到,放在jdk的bin文件下,和当前目录(.) , 也能找到的原因。

Native.loadLibrary("TestDLL" , class); 底层使用的方法是System.loadLibrary("TestDLL");

2. 加载dll文件的路径

从前面可以看到dll放的路径, 一般是C:\Windows\system32(注意:在win10系统中,是放在windows\sysWow\下的); 或者是jdk的bin文件下,
或者path 路径下, 或者整个项目名下。
 

 整个项目下,可以用使用

System.loadLibrary("src/com/alison/jnaDemo/CreateDll");   //项目下src/com/alison/jnaDemo/CreateDll.dll可以加载
使用\\就不行了

 

posted @ 2017-09-01 23:50  AlisonGavin  阅读(3060)  评论(0编辑  收藏  举报