나는 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()
메서드를 다시 호출하기 전에 시도해 볼 방법이 있습니까?
EDIT : 이상하게도 내가 System.load()
호출을 try-catch 블록으로 둘러싸면 여전히 UnsatisfiedLinkError가 발생하지만 실제로는 getSysIdNative()
에 대한 호출에서 발생합니다. 내가 보는 오류는 다음과 같습니다.
lib.sysid.SysId.getSysIdNative()I
"I"가 나타나는 것은 무엇입니까? 이 코드에 디버거를 연결하여 메시지가 채워지는 곳을 확인하려고했지만 지금까지 성공하지 못했습니다.
정확히 내가 보는 문제입니다. 시스템에 몇 가지 논리가 있는데, 위의 파일을 포함하여 시스템과 관련된 모든 라이브러리 파일을 "다시로드"하지만 처음에는 파일을로드하는 것과 다른 클래스 로더를 통해이 작업을 수행합니다. – troyal