如何将本机库和 JNI 库捆绑在 JAR 中?
2022-08-31 09:06:48
可以创建单个 JAR 文件,其中包含所有依赖项,包括一个或多个平台的本机 JNI 库。基本机制是使用 System.load(File) 来加载库,而不是搜索 java.library.path 系统属性的典型 System.loadLibrary(String)。此方法使安装变得更加简单,因为用户不必在其系统上安装 JNI 库,但代价是可能不支持所有平台,因为平台的特定库可能不包含在单个 JAR 文件中。
流程如下:
我为jzmq添加了功能,即ZeroMQ(无耻插件)的Java绑定。代码可以在这里找到。jzmq 代码使用混合解决方案,因此,如果无法加载嵌入式库,代码将恢复为沿 java.library.path 搜索 JNI 库。
https://www.adamheinrich.com/blog/2012/12/how-to-load-native-jni-library-from-jar/
是很棒的文章,它解决了我的问题..
在我的情况下,我有以下代码用于初始化库:
static {
try {
System.loadLibrary("crypt"); // used for tests. This library in classpath only
} catch (UnsatisfiedLinkError e) {
try {
NativeUtils.loadLibraryFromJar("/natives/crypt.dll"); // during runtime. .DLL within .JAR
} catch (IOException e1) {
throw new RuntimeException(e1);
}
}
}