防止Java多次加载库
我有几个类使用相同的JNI库,名为“jni”。在每一个这些类的,我在类的静态初始化一个的System.loadLibrary()调用:防止Java多次加载库
Class class1 {
static{
System.loadLibrary("jni");
}
...
}
Class class2 {
static{
System.loadLibrary("jni");
}
...
}
唯一的问题是,我只想要的System.loadLibrary()被调用一次,因为它可以采取一会儿。有没有一种简单而干净的方法来防止同一个库的多重加载?
如果库已经被加载,任何后续调用加载相同的库将被忽略。
加载由 libname参数指定的系统库。库名称映射到 实际系统库的 中的方式与系统 相关。
呼叫的System.loadLibrary(名称)是 实际上等效于呼叫
Runtime.getRuntime().loadLibrary(name)
荷载与 指定库名的动态库。包含本地代码的文件 从 加载本地文件系统 其中库文件通常在 获得。这个过程的细节 是依赖于实现的。从库名映射到 特定文件名的 以 系统特定的方式完成。
首先,如果有安全管理器, 其checkLink方法以 作为其参数调用。这可能是 导致安全异常。
方法System.loadLibrary(String) 是调用此方法的常规和方便的 方法。如果 本地方法是在 实现类的使用,标准 策略是将本机代码 库文件(称之为LIBFILE)和 然后把静态初始化:
static { System.loadLibrary("LibFile"); }
在类声明中。当 类被加载并初始化时,原生方法的必需本机代码实现 然后将被加载 。
如果此方法是用相同的库名叫做超过 一次, 第二次及以后的调用是 忽略。
我敢肯定,任何后续调用加载已加载的库没有任何效果[来源请求]。
这已在ClassLoader
类源代码中验证过,但我仍在试图找到一个好的源代码。
创建一个单例类负荷 “JNI” 只有在它的第一个实例,并调用class1的这个单和CLASS2代替的System.loadLibrary( “JNI”)
是的 - 你明白了:) – 2009-07-15 18:33:04
这对于System.load也是如此吗?文档没有具体说明。 – 2014-06-10 03:48:41
是的。对于System.load也是如此。 – 2014-09-29 10:11:46