防止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
:
使用指定的库名称加载动态库。 包含本机代码的文件从本地文件系统从常规获取库文件的位置加载。 此过程的详细信息取决于实现。 从库名称到特定文件名的映射是以特定于系统的方式完成的。
首先,如果有安全管理器,则调用其checkLink方法,并将libname作为其参数。 这可能会导致安全性exception。
System.loadLibrary(String)方法是调用此方法的常规方便方法。 如果要在类的实现中使用本机方法,则标准策略是将本机代码放入库文件(称为LibFile),然后放置静态初始化程序:
static { System.loadLibrary("LibFile"); }
在类声明中。 当加载并初始化类时,也将加载本机方法的必要本机代码实现。
如果使用相同的库名称多次调用此方法,则忽略第二次和后续调用。
来自JavaDocs –
如果使用相同的库名称多次调用此方法,则忽略第二次和后续调用。
我很确定任何后续调用加载已加载的库都没有效果[需要引证]。
这已在ClassLoader
类源代码中得到validation,但我仍在尝试为此找到一个好的来源。
创建一个仅在第一次实例化时加载“jni”的单例类,并在class1和class2中调用此单例而不是System.loadLibrary(“jni”)