2009-07-15 259 views
13

我有几个类使用相同的JNI库,名为“jni”。在每一个这些类的,我在类的静态初始化一个的System.loadLibrary()调用:防止Java多次加载库

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

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

唯一的问题是,我只想要的System.loadLibrary()被调用一次,因为它可以采取一会儿。有没有一种简单而干净的方法来防止同一个库的多重加载?

回答

30

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

System.loadLibrary

加载由 libname参数指定的系统库。库名称映射到 实际系统库的 中的方式与系统 相关。

呼叫的System.loadLibrary(名称)是 实际上等效于呼叫

Runtime.getRuntime().loadLibrary(name) 

Runtime.loadLibrary

荷载与 指定库名的动态库。包含本地代码的文件 从 加载本地文件系统 其中库文件通常在 获得。这个过程的细节 是依赖于实现的。从库名映射到 特定文件名的 以 系统特定的方式完成。

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

方法System.loadLibrary(String) 是调用此方法的常规和方便的 方法。如果 本地方法是在 实现类的使用,标准 策略是将本机代码 库文件(称之为LIBFILE)和 然后把静态初始化:

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

在类声明中。当 类被加载并初始化时,原生方法的必需本机代码实现 然后将被加载 。

如果此方法是用相同的库名叫做超过 一次, 第二次及以后的调用是 忽略。

+0

是的 - 你明白了:) – 2009-07-15 18:33:04

+1

这对于System.load也是如此吗?文档没有具体说明。 – 2014-06-10 03:48:41

+0

是的。对于System.load也是如此。 – 2014-09-29 10:11:46

0

我敢肯定,任何后续调用加载已加载的库没有任何效果[来源请求]。

这已在ClassLoader类源代码中验证过,但我仍在试图找到一个好的源代码。

0

创建一个单例类负荷 “JNI” 只有在它的第一个实例,并调用class1的这个单和CLASS2代替的System.loadLibrary( “JNI”)

2

JavaDocs -

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