防止Java多次加载库

Bri*_*ian 13 java java-native-interface

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

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

Class class2 {
    static{
        System.loadLibrary("jni");
    }
    ...
}
Run Code Online (Sandbox Code Playgroud)

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

And*_*are 32

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

System.loadLibrary:

加载libname参数指定的系统库.库名称映射到实际系统库的方式取决于系统.

调用System.loadLibrary(name)实际上等同于调用

 Runtime.getRuntime().loadLibrary(name)
Run Code Online (Sandbox Code Playgroud)

Runtime.loadLibrary:

使用指定的库名称加载动态库.包含本机代码的文件从本地文件系统从常规获取库文件的位置加载.此过程的详细信息取决于实现.从库名称到特定文件名的映射是以特定于系统的方式完成的.

首先,如果有安全管理器,则以libname作为其参数调用其checkLink方法.这可能会导致安全性异常.

System.loadLibrary(String)方法是调用此方法的常规方便方法.如果要在类的实现中使用本机方法,则标准策略是将本机代码放入库文件(称为LibFile),然后放置静态初始化程序:

 static { System.loadLibrary("LibFile"); }
Run Code Online (Sandbox Code Playgroud)

在类声明中.当加载并初始化类时,也将加载本机方法的必要本机代码实现.

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

  • System.load也是如此吗?文档未指定任何一种方式。 (2认同)
  • 是的。System.load 也是如此。 (2认同)