Java-在使用java JNI时,如何unload本地库?

Java-在使用java JNI时,如何unload本地库?

甜柠檬 发布于 2017-08-24 字数 114 浏览 1140 回复 2

使用JNI时,为了方便加载本地库,就把本地库作为临时文件copy到了系统path中,如何在程序结束时删除这个临时文件?

如果你对这篇文章有疑问,欢迎到本站 社区 发帖提问或使用手Q扫描下方二维码加群参与讨论,获取更多帮助。

扫码加入群聊

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

灵芸 2017-10-22 2 楼

copy时保留文件引用(文件名),退出main方法之前删除临时文件(File类就够了)。

要是无法保留临时文件引用,那创建临时文件时,就自己命名(无法命名就先新建,再通过文件流自己实现复制)。自己命名之后,删除它就知道是哪个了

清晨说ぺ晚安 2017-09-25 1 楼

为什么要copy到path中呢??
1.程序启动的时候可以增加临时path,在启动参数里可以设置
2.程序运行中也可以动态增加path的内容。
自己copy的话,如果异常退出(虚拟机崩溃、手工结束进程)你会监听不到事件,无法删除临时文件

下面是我自己用的一个动态增加path的方法,jdk5、6下肯定好使,使用了反射的private的field,所以可能jdk的后续版本会无效,不过是我目前发现的最方便的方法了:

public static void addUserPath(String s) {
try {
Field field = ClassLoader.class.getDeclaredField("usr_paths");
field.setAccessible(true);
String[] paths = (String[]) field.get(null);
for (int i = 0; i < paths.length; i++) {
if (s.equals(paths[i])) {
return;
}
}
String[] tmp = new String[paths.length + 1];
System.arraycopy(paths, 0, tmp, 0, paths.length);
tmp[paths.length] = s;
field.set(null, tmp);
} catch (IllegalAccessException e) {
throw new RuntimeException(e);
} catch (NoSuchFieldException e) {
throw new RuntimeException(e);
}