开发了一个功能 jar 包,依赖动态库。为了方便分发,动态库打包到了 resources 目录,
用的 Native.loadLibrary 方法载入。
- 在 IDEA 开发环境下直接运行,正常。
- 打包 jar 自己运行,正常。
- 被其他项目以 jar 库形式依赖,其他项目调用接口,报错,找不到动态库。
感觉这应该是一个比较常见的诉求吧,也不知道众多其他第三方库都是怎么处理的。
开发了一个功能 jar 包,依赖动态库。为了方便分发,动态库打包到了 resources 目录,
用的 Native.loadLibrary 方法载入。
感觉这应该是一个比较常见的诉求吧,也不知道众多其他第三方库都是怎么处理的。
jna
中的 Native.load
方法加载。在 resources
下面建立 linux-x86-64
,放入 so 文件比如 libmyload.so
。
建立一个 Class:
public interface MyLoad extends Library {
// 定义 so 文件中的方法。
}
之后加载:
try {
mt = Native.load("myload", MyLoad.class);
} catch (UnsatisfiedLinkError e) {
log.error("", e);
}
这样就能直接从 jar 中的 resources 文件中加载到 so。
使用 jna
更加方便,不需要像 jni
那样定义繁琐的 jni 接口方法。
15 回答8.4k 阅读
8 回答6.2k 阅读
1 回答4k 阅读✓ 已解决
3 回答6k 阅读
3 回答2.2k 阅读✓ 已解决
2 回答3.1k 阅读
2 回答3.8k 阅读
简单研究发现,似乎只能从文件路径进行加载。 https://stackoverflow.com/questions/4113317/load-library-from-jar
所以,解决方案应该是,在运行时 将动态库解压至临时文件目录,在执行完毕后 将临时文件清除即可。