我有一个类调用本机函数从CMOS获取有关系统的信息。这个类有它加载含有本地函数库的静态初始化块,它看起来是这样的:如何避免两次调用System.load?
package lib.sysid;
public class SysId
{
private static native int getSysIdNative();
private static final String SYS_ID_PATH = "libsysid.so";
static
{
System.load(SYS_ID_PATH);
}
public static int getSysIdFromCMOS()
{
int returnValue = getSysIdNative();
}
}
根据我的测试中,该方法能正常工作,我第一次使用它,但如果我叫在稍后的时间再次方法,静态初始化块也运行,造成UnsatisfiedLinkError:
java.lang.UnsatisfiedLinkError: Native Library libsysid.so already loaded in another classloader
我怎样才能避免执行System.load()
方法,如果它已经运行静态初始化块?
另外,有没有办法让我试图“卸载”库,如果它已经加载之前再次调用System.load()
方法?
编辑:奇怪的是,如果我用try-catch块围绕System.load()
调用,我仍然得到一个UnsatisfiedLinkError,但是这次它来自getSysIdNative()
的实际调用。我看到的错误如下:
lib.sysid.SysId.getSysIdNative()I
什么是“我”显示了?我试图附加一个调试器到这个代码来查看消息的填充位置,但到目前为止我还没有成功。
这就是我看到的问题。我使用的系统中有一些逻辑“重新加载”了与系统相关的所有库文件,包括我的上述文件,但是它通过与第一次加载文件不同的类加载器来完成此操作。 – troyal 2010-07-27 18:15:14