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可以加载
使用\\就不行了