我目前有一个Java应用程序,它在两个不同的平台Windows和Linux上的本机库中动态加载。我有针对这两个系统构建的相同库,一个library.dll和一个liblibrary.so。
我必须把这个东西发给客户,所以我已经将IntelliJ打包了.msi和.deb工件。现在,不是将这些软件包与相应的动态库一起发送,并指示客户将它们放在windows / system32和/ usr / lib /目录中,我更倾向于在幕后处理这些问题。我想有一些方法可以将动态库打包到我的.msi或.deb中,并指示这些安装程序将库复制到正确的文件夹,但我担心权限错误等等。
我已经读过Java 1.8现在支持静态库,但似乎缺乏关于你应该如何实现这一目标的文档。每个人都同意您需要在您的资源库JNI_OnLoad_LibraryName
和JNI_OnUnload_LibraryName
中公开两个新来电,并且您只需像往常一样致电System.loadLibrary("libraryName")
。但是,似乎没有人提及或至少提供有关如何将静态库与JVM一起打包的说明。
关于添加此功能的Java文档只是声明:
本机JVMTI代理可以与VM静态链接。组合库和VM映像的方式取决于实现。
我是不是在寻找合适的术语来了解如何将静态本机库打包到JVM中?我是否应该打扰静态库?是否有一些我想念的简单解决方案?
答案 0 :(得分:0)
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);
}
}
}