背景:
把带有底层驱动和算法的dll文件封装进jar包,项目里正常执行,封装的jar包调用就报链接库错误。
也有很多小伙伴出现了这个问题。。。
解决方案:
此时你的目录结构最起码是这样的:
并且运行是成功的。
1.新建ARtifacts
选择你要打包的module,选择Main Class
OK之后:
此时打包的jar会报错。
原因是缺少了META-INF文件,右键你的jar,选择Create Directory:
新建META-INF,在此文件夹下,右键
OK就好。
这样打的jar包就已经带了dll了。
2.加载dll
一般JNI都是用System.loadLibrary的方式:
static { System.loadLibrary("aaa"); System.loadLibrary("bbb"); }
这样就会出现本地项目代码运行没问题,但是jar包会提示找不到llb:
在loadLibrary那块加一下代码,将dll读取到缓存:
private static void loadLibrary(String libName){
try {
InputStream in = Main.class
.getResourceAsStream("/lib/" + libName); // dll文件位置
File ffile = new File("");
String filePath = null;
filePath = ffile.getAbsolutePath() + File.separator
+ libName;
File dll = new File(filePath);
FileOutputStream out = new FileOutputStream(dll); //缓存dll位置
int i;
byte[] buf = new byte[1024];
try {
while ((i = in.read(buf)) != -1) {
out.write(buf, 0, i);
}
} finally {
in.close();
out.close();
}
System.load(dll.getAbsolutePath());//
dll.deleteOnExit();
} catch (Exception e) {
System.err.println("load jni error!");
// e.printStackTrace();
}
}
之后可以尝试运行一下,是不妨碍也运行成功了的。
关于路径,我这边是/lib/下。
3.打包
Build -> Build Artifacts,选择Build或者Rebuild都行。
在 module,与src同级的out文件夹下生成jar。
4.检验是否成功
可以用java -jar检测一下,当然Main里面得写好测试代码。
也可以建个demo运行一下:
参考:
这篇文章是指导方向的,但是我也是摸了一会儿石头过河,因为idea升级等原因原有博客很多地方都变了:
IntelliJ Idea+javafx+第三方库+dll 打包为jar - it610.com
这篇是关于打jar包的:
IDEA打包项目模块生成jar包_xichanjuan6481的博客-CSDN博客_idea 模块打包
不过文字比较多,我上面也简单的总结了一下。