防止Java多次加载库


问题内容

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

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

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

唯一的问题是,我只希望System.loadLibrary()被调用一次,因为这可能需要一段时间。有没有一种简便的方法来防止同一库的多次加载?


问题答案:

如果已经加载了库,则随后的任何加载相同库的调用都将被忽略。

System.loadLibrary

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

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

 Runtime.getRuntime().loadLibrary(name)

Runtime.loadLibrary

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

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

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

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

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

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