我有几个使用相同JNI库的类,名为“jni”。在每个类中,我在类的静态初始化程序中调用了System.loadLibrary():
Class class1 {
static{
System.loadLibrary("jni");
}
...
}
Class class2 {
static{
System.loadLibrary("jni");
}
...
}
唯一的问题是,我只想调用一次System.loadLibrary(),因为它可能需要一段时间。是否有一种简单而干净的方法来防止同一个库的多次加载?
答案 0 :(得分:32)
如果已加载库,则将忽略任何后续加载相同库的调用。
加载指定的系统库 libname参数。中的方式 哪个库名称映射到 实际的系统库是系统 依赖
调用System.loadLibrary(name)是 实际上相当于电话
Runtime.getRuntime().loadLibrary(name)
使用。加载动态库 指定的库名称。一份文件 包含本机代码从中加载 来自某个地方的本地文件系统 其中库文件是常规的 获得。这个过程的细节 是依赖于实现的。该 从库名称映射到 特定文件名在a中完成 系统特定的方式。
首先,如果有安全经理, 调用它的checkLink方法 libname作为其参数。这可能 导致安全例外。
方法System.loadLibrary(String) 是传统而方便的 调用此方法的方法。如果 本机方法将被用于 实施一个类,一个标准 策略是将本机代码放入 一个库文件(称之为LibFile)和 然后放一个静态初始化器:
static { System.loadLibrary("LibFile"); }
在类声明中。当。。。的时候 class被加载并初始化了 必要的本机代码实现 然后是本机方法 也加载了。
如果调用此方法超过 一旦使用相同的库名, 第二次和后续的电话是 忽略。 强>
答案 1 :(得分:2)
来自JavaDocs -
如果使用相同的库名称多次调用此方法,则忽略第二次和后续调用。
答案 2 :(得分:0)
我很确定任何后续调用加载已加载的库都没有效果[需要引证]。
这已在ClassLoader
类源代码中得到验证,但我仍在尝试为此找到一个好的来源。
答案 3 :(得分:0)
创建一个仅在第一次实例化时加载“jni”的单例类,并在class1和class2中调用此单例而不是System.loadLibrary(“jni”)