防止Java多次加载库

防止Java多次加载库,java,java-native-interface,Java,Java Native Interface,我有几个类使用相同的JNI库,称为“JNI”。在每个类中,我在类的静态初始值设定项中都有一个System.loadLibrary()调用: Class class1 { static{ System.loadLibrary("jni"); } ... } Class class2 { static{ System.loadLibrary("jni"); } ... } static { System.loadL

我有几个类使用相同的JNI库,称为“JNI”。在每个类中,我在类的静态初始值设定项中都有一个System.loadLibrary()调用:

Class class1 {
    static{
        System.loadLibrary("jni");
    }
    ...
}

Class class2 {
    static{
        System.loadLibrary("jni");
    }
    ...
}
 static { System.loadLibrary("LibFile"); }

唯一的问题是,我只希望调用System.loadLibrary()一次,因为这可能需要一段时间。是否有一种简单而干净的方法来防止对同一个库进行多次加载?

如果已经加载了库,则将忽略加载同一库的任何后续调用

:

加载由指定的系统库 libname参数。举止 哪个库名称映射到 实际的系统库是系统 依赖的

调用System.loadLibrary(名称)是 实际上相当于通话

 Runtime.getRuntime().loadLibrary(name)
:

使用 指定的库名称。档案 包含的本机代码从加载 从某个位置删除本地文件系统 库文件按惯例存放在哪里 获得。这个过程的细节是什么 它们依赖于实现。这个 从库名称映射到 特定的文件名是在 系统特定方式

首先,如果有安全经理, 它的checkLink方法是用 libname作为其参数。今年五月 导致安全异常

方法System.loadLibrary(字符串) 是传统的和方便的吗 调用此方法的方法。如果 本机方法将用于 类、标准的实现 策略是将本机代码放入 库文件(称为LibFile)和 然后放置一个静态初始值设定项:

Class class1 {
    static{
        System.loadLibrary("jni");
    }
    ...
}

Class class2 {
    static{
        System.loadLibrary("jni");
    }
    ...
}
 static { System.loadLibrary("LibFile"); }
在类声明中。当 类进行加载和初始化时 必要的本机代码实现 对于本机方法,将 也装了

如果调用此方法的次数超过 一旦使用相同的库名称,则 第二次和随后的呼叫是 已忽略。


我敢肯定,任何后续调用加载已经加载的库都不会产生任何效果[需要引用]


这在
ClassLoader
类源代码中得到了验证,但我仍在尝试为此寻找一个好的源代码。

创建一个只在第一次实例化时加载“jni”的单例类,并在class1和class2中调用该单例,而不是在System.loadLibrary(“jni”)中从-

如果使用相同的库名称多次调用此方法,则忽略第二次和后续调用


System.load也是这样吗?文档没有指定任何一种方式。是的。System.load也是如此。