У меня есть класс, который вызывает встроенную функцию для получения информации о системе из ее CMOS. Класс имеет статический блок инициализации, который загружает библиотеку, содержащую нативную функцию, и выглядит примерно так:
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()
?
РЕДАКТИРОВАТЬ: как ни странно, если я окружаю вызов System.load()
блоком try-catch, я все равно получаю UnsatisfiedLinkError, но на этот раз это происходит от фактического вызова getSysIdNative()
. Я вижу следующую ошибку:
lib.sysid.SysId.getSysIdNative()I
Какого черта это «я», которое появляется? Я пытался прикрепить отладчик к этому коду, чтобы увидеть, где заполняется сообщение, но пока что я не увенчался успехом.