您的位置:首页 > 编程语言 > Java开发

java.lang.UnsatisfiedLinkError: Can not load XXX library ... JNA不能加载DLL动态库问题

2016-03-10 17:58 483 查看
java.lang.UnsatisfiedLinkError: Can not load XXX library ... JNA不能加载DLL动态库问题

1, 版本问题。

版本一定要对应。

64位系统,对应64的jdk或者jre,同时对应动态库也需要64位的。

32位也是如此对应。

如果机器上装了两套jre或jdk, 例如同时装了32和64的jre, 需要将本机运行的jre设定为64的版本,具体为控制面板的java 控制台中设置对应的java版本。

点击Java,查看,进行查找和添加等操作。确保64位的启用。



2,路径问题。

1:使用JNA 加载dll你首先需要下载JNA.jar,这个jar文件可以在sun官网下载到。

2:dllName这个地方只能是dll的名字,不能加".dll"这个是为了跨平台。

使用JNA通常会遇到不能加载的问题,这一般是应为dll文件没有放在正确的位置导致的。

路径可以设置为绝对路径或相对路径。

绝对路径:

TestDll1 INSTANCE = (TestDll1)Native.loadLibrary("D:\\test\\TestDll1", TestDll1.class);


然后DLL放到D盘下面test文件夹下。

相对路径:

在web服务中,可以放到WEB-INF下res文件夹下

String realPath = ContextLoader.getCurrentWebApplicationContext().getServletContext().getRealPath("WEB-INF/res/TestDll1.dll");
String path =realPath.substring(0,realPath.length()-4);
TestDll1 INSTANCE = (TestDll1)Native.loadLibrary( path, TestDll1.class);


PS:跨平台的写法

通常我们在使用JNA的时候会使用下面的方式(假设DLL名为helloDll.dll)

interface HelloDll extends Library {
TestDll1 INSTANCE = (TestDll1 )Native.loadLibrary("driver/TestDll1 ", TestDll1 .class);
public void hello();
}


1. 在这种情况下,我们需要将TestDll1 这个文件拷贝到driver目录下。

2. 同时为了跨平台,相对路径应该这么写:

"driver" + File.separator + "TestDll1 "
3. 另外,如果TestDll1 .dll依赖其他包的话,也要将包拷贝到driver目录下或是系统路径。查看dll依赖关系的工具很多,google一下就行了。

参考:

经过上述步骤,基本可以解决,如果还不行,参考如下步骤:

1:dll文件要放到项目路径下;

2:把dll文件放到库文件路径下,执行这句代码 System.out.println(System.getProperty("java.library.path"));

然后把dll文件copy到任意一个路径下

3:dll名字好像不能带有“_”(这个是我自己遇到的一个问题,仅供参考)

注意到这三点基本可以解决使用JNA加载C++,Delphi,C的dll的所有问题了。

链接:
http://blog.sina.com.cn/s/blog_b7c09bc00101d2sk.html http://blog.csdn.net/zhhniyniy/article/details/7968752
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: