본문 바로가기

개발 지식/Java

[Java] UnsatisfiedLinkError

반응형

UnsatisfiedLinkError

클래스 로더는 네이티브 호출을 적절한 정의로 연결할 때 중용한 역할을 한다. UnsatisfiedLinkError는 존재하지 않는 라이브러리나 잘못 배치된 기본 라이브러리를 로딩할 때 링크 단계(linking phase)의 끝에서 발생한다.

즉, JVM이 native로 선언된 메소드의 적절한 기본 언어 정의를 찾을 수 없을 때 발생한다. 기본 메소드가 호출될 때, 클래스 로더는 그 메소드를 정의하는 기본 라이브러리를 로딩하려고 한다. 그 라이브러리를 찾을 수 없을 경우 에러가 생긴다.


UnsatisfiedLinkError 발생 예시

public class UnsatisfiedLinkErrorTest {
    public native void call_A_Native_Method();
    static {
        System.loadLibrary("myNativeLibrary");
    }

    public static void main(String[] args) {
        new UnsatisfiedLinkErrorTest().call_A_Native_Method();
    }
}

해당 코드는 call_A_Native_Method() 메소드를 호출하는데, 이것은 기본 라이브러리인 myNativeLibrary에서 정의된다. 이 라이브러리는 존재하지 않기 때문에, 프로그램이 실행될 때 에러가 발생한다.

기본 라이브러리의 로딩은 UnsatisfiedLInkErrorTest의 클래스 로더인 System.loadLibrary()를 호출하는 클래스의 클래스 로더에 의해 초기화 된다. 이것이 어떤 클래스 로더인지에 따라, 다른 위치가 검색된다.

부트스트랩 클래스 로더에 의해 로딩된 클래스의 경우, sun.boot.library.path가 검색된다. 확장 클래스 로더에 의해 로딩된 클래스의 경우, java.ext.dirs가 검색되고, 그 뒤를 이어 sun.boot.library.path와 java.library.path가 검색된다. 시스템 클래스 로더에 의해 로딩된 클래스의 경우, sun.boot.library.path가 검색되고, 그 뒤를 이어 jav.library.path가 검색된다.

위 예시에서 UnsatisfiedLinkErrorTest 클래스는 시스템 클래스 로더에 의해 로딩된다. 참조된 기본 라이브러리를 로딩하기 위해 이 클래스 로더는 sun.boot.library.path와 java.library.path를 검색한다. 이 라이브러리는 이 두 개의 위치에서 사용할 수 없으므로, 클래스 로더는 UnsatisfiedLinkageError를 던진다.
반응형

'개발 지식 > Java' 카테고리의 다른 글

[JAVA] JDBC란  (1) 2020.02.05
[JAVA] Servlet(서블릿) 이란  (0) 2020.01.27
Mybatis Mapper 인터페이스  (0) 2020.01.20
[Java] Robot 클래스 정리  (0) 2019.12.10
Java 데이터 타입 Integer와 int의 차이  (0) 2019.11.27