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

 2023-01-21    250  

问题描述

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

我必须将此东西发送给客户,所以我已经将Intellij打包了.msi和.deb工件.现在,与其还将这些软件包与各自的动态库一起发送,并指示客户将它们放在Windows/System32和/usr/lib/Directories中,而是更喜欢这一切都在幕后照顾.我想有某种方法可以将动态库包装到我的.msi或.deb中,并指示这些安装程序将库将库复制到正确的文件夹,但是我担心权限错误和类似的内容.

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

我已经读到Java 1.8现在支持静态库,但是似乎缺乏关于您应该如何完成此操作的文档.每个人都同意,您需要在库中公开两个新的电话,JNI_OnLoad_LibraryName和JNI_OnUnload_LibraryName,您只能拨打System.loadLibrary(“libraryName”)与往常一样.但是,似乎没有人提及或至少提供有关如何与JVM一起打包静态库的说明.

有关添加此功能的Java文档简单地说明:

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

我只是不搜索正确的条款来找出如何将静态本机库包装到JVM中吗?我什至应该打扰静态图书馆吗?我缺少一些更轻松的解决方案吗?

推荐答案

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

以上所述是小编给大家介绍的如何打包静态加载的JNI库?,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对77isp云服务器技术网的支持!

原文链接:https://77isp.com/post/26303.html

=========================================

https://77isp.com/ 为 “云服务器技术网” 唯一官方服务平台,请勿相信其他任何渠道。