如何打包静态加载的JNI库?

时间:2017-07-20 16:54:05

标签: java intellij-idea java-native-interface static-libraries dynamic-library

我目前有一个Java应用程序,它在两个不同的平台Windows和Linux上的本机库中动态加载。我有针对这两个系统构建的相同库,一个library.dll和一个liblibrary.so。

我必须把这个东西发给客户,所以我已经将IntelliJ打包了.msi和.deb工件。现在,不是将这些软件包与相应的动态库一起发送,并指示客户将它们放在windows / system32和/ usr / lib /目录中,我更倾向于在幕后处理这些问题。我想有一些方法可以将动态库打包到我的.msi或.deb中,并指示这些安装程序将库复制到正确的文件夹,但我担心权限错误等等。

我已经读过Java 1.8现在支持静态库,但似乎缺乏关于你应该如何实现这一目标的文档。每个人都同意您需要在您的资源库JNI_OnLoad_LibraryNameJNI_OnUnload_LibraryName中公开两个新来电,并且您只需像往常一样致电System.loadLibrary("libraryName")。但是,似乎没有人提及或至少提供有关如何将静态库与JVM一起打包的说明。

关于添加此功能的Java文档只是声明:

  

本机JVMTI代理可以与VM静态链接。组合库和VM映像的方式取决于实现。

我是不是在寻找合适的术语来了解如何将静态本机库打包到JVM中?我是否应该打扰静态库?是否有一些我想念的简单解决方案?

1 个答案:

答案 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);
        }
    }
}