防止Java多次加载库 [英] Prevent Java from loading library more than once

查看:82
本文介绍了防止Java多次加载库的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

I have several classes that use the same JNI library, called "jni". In each of those classes, I have a System.loadLibrary() call in the class's static initializer:

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

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

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

The only problem is, I only want System.loadLibrary() to be called once, since it can take a while. Is there an easy and clean way to prevent multiple loadings of the same library?

推荐答案

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

If the library has already be loaded any subsequent calls to load the same library will be ignored.

System.loadLibrary :

加载由指定的系统库 libname参数.的方式 哪个库名称已映射到 实际的系统库是系统 依赖.

Loads the system library specified by the libname argument. The manner in which a library name is mapped to the actual system library is system dependent.

调用System.loadLibrary(name)是 有效地等同于通话

The call System.loadLibrary(name) is effectively equivalent to the call

 Runtime.getRuntime().loadLibrary(name)

Runtime.loadLibrary :

使用 指定的库名.一份文件 包含本机代码的加载是从 本地文件系统 传统上的库文件 获得.这个过程的细节 是依赖于实现的.这 从库名到 特定的文件名在 系统特定的方式.

Loads the dynamic library with the specified library name. A file containing native code is loaded from the local file system from a place where library files are conventionally obtained. The details of this process are implementation-dependent. The mapping from a library name to a specific filename is done in a system-specific manner.

首先,如果有安全经理, 它的checkLink方法被调用 libname作为其参数.这可能 导致安全异常.

First, if there is a security manager, its checkLink method is called with the libname as its argument. This may result in a security exception.

System.loadLibrary(String)方法 是常规且方便 调用此方法的方法.如果 本机方法将用于 实现一个类,一个标准 策略是将本机代码放入 库文件(称为LibFile)和 然后放置一个静态初始值设定项:

The method System.loadLibrary(String) is the conventional and convenient means of invoking this method. If native methods are to be used in the implementation of a class, a standard strategy is to put the native code in a library file (call it LibFile) and then to put a static initializer:

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

在类声明中.当...的时候 类被加载和初始化, 必要的本机代码实现 因为本地方法将是 也已加载.

within the class declaration. When the class is loaded and initialized, the necessary native code implementation for the native methods will then be loaded as well.

如果此方法的调用次数超过 一旦具有相同的库名称, 第二个及以后的电话是 忽略.

If this method is called more than once with the same library name, the second and subsequent calls are ignored.

这篇关于防止Java多次加载库的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆