我有一個類調用本機函數從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