jna加载DLL
java加载dll,目前用的方式就是Native.loadLibrary,或者高版本一点的是Native.load,都差不多,不过大家应该都遇到的问题了,用idea运行时,没任何问题,但是打出来的jar就出问题了。可能大家都会打开jar看看里面有没有这个dll资源,作者用的是gradle,jar里面确实是有xx.dll的,但是运行jar之后就异常退出了。百度说可以拷贝到system32下,但是个人不喜欢,就是不想人工干预。
1、单个dll加载
如果Native.loadLibrary 加载的dll只有一个,也就是说,这个dll不依赖其他的dll,可以用以下方式:
建固定的文件夹名称 win32-x86 和 win32-x86-64,分别放32位和64位的dll,用Native.loadLibrary加载就可以,无论是idea运行还是jar运行都可以的
2、多个dll依赖
也就是加载一个dll,但是这个dll还依赖了其他的dll,
使用Native.loadLibrary,加载箭头的dll,在idea中没问题,但是运行jar就挂了。
这里作者引入 DllUtils.java,调用DllUtils.loadDll(“lib/xx/xxx.dll”, clazz);就可以工作,主要逻辑是把jar里面的dll拷贝出来和jar的同级下
public synchronized static Object loadDll(String libName, Class<?> className) {
try{
return Native.loadLibrary(libName, className);
}catch (Throwable ex){ }
String pathname = System.getProperty("user.dir") + File.separator + libName;
File file = new File(pathname);
if (!file.exists()) {
File libFile = new File(libName);
try {
loadRecourseFromJarByFolder(File.separator + libFile.getParent(), System.getProperty("user.dir") ,DllUtils.class);
} catch (Exception e) {
log.info("复制DLL文件异常:", e);
}
}
File file1 = new File(pathname);
if (!file1.exists()) {
pathname = libName;
}
return Native.loadLibrary(pathname, className);
}
但是这个工具还有不足的地方,没有适配加载resources根下的dll,要用的朋友自己改下吧,作者比较懒,
附下代码的下载地址
https://download.csdn.net/download/ADdhtfdhdg/12881997