防止Java多次加载库

时间:2009-07-15 18:26:15

标签: java java-native-interface

我有几个使用相同JNI库的类,名为“jni”。在每个类中,我在类的静态初始化程序中调用了System.loadLibrary():

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

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

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

4 个答案:

答案 0 :(得分:32)

如果已加载库,则将忽略任何后续加载相同库的调用。

System.loadLibrary

  

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

     

调用System.loadLibrary(name)是   实际上相当于电话

 Runtime.getRuntime().loadLibrary(name)

Runtime.loadLibrary

  

使用。加载动态库   指定的库名称。一份文件   包含本机代码从中加载   来自某个地方的本地文件系统   其中库文件是常规的   获得。这个过程的细节   是依赖于实现的。该   从库名称映射到   特定文件名在a中完成   系统特定的方式。

     

首先,如果有安全经理,   调用它的checkLink方法   libname作为其参数。这可能   导致安全例外。

     

方法System.loadLibrary(String)   是传统而方便的   调用此方法的方法。如果   本机方法将被用于   实施一个类,一个标准   策略是将本机代码放入   一个库文件(称之为LibFile)和   然后放一个静态初始化器:

 static { System.loadLibrary("LibFile"); }
     

在类声明中。当。。。的时候   class被加载并初始化了   必要的本机代码实现   然后是本机方法   也加载了。

     

如果调用此方法超过   一旦使用相同的库名,   第二次和后续的电话是   忽略。

答案 1 :(得分:2)

来自JavaDocs -

  

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

答案 2 :(得分:0)

我很确定任何后续调用加载已加载的库都没有效果[需要引证]。

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

答案 3 :(得分:0)

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