JNI 개요
JVM의 관점에서 "Java™" 및 "native" 의 두 가지 유형의 코드가 있습니다. JNI (Java Native Interface) 는 둘 사이에 잘 정의되고 플랫폼 독립적인 인터페이스를 설정합니다.
원시 코드는 실행 중인 JVM에서 "원시 메소드" 로, "호출 API" 를 사용하여 JVM을 작성하는 코드로 Java와 함께 사용할 수 있습니다. 이 섹션에서 이러한 차이점에 대해 설명합니다.
원시 메소드
Java 원시 메소드는 Java로 선언되고 다른 언어 (예: C 또는 C++) 로 구현되며 필요에 따라 JVM에 의해 로드됩니다. 원시 메소드를 사용하려면 다음을 수행해야 합니다.
- Java 코드에서 원시 메소드를 선언 하십시오.
javac 컴파일러가 Java 소스 코드에서 원시 메소드 선언을 발견하면 메소드의 이름 및 매개변수를 기록합니다. Java 소스 코드에는 구현이 포함되어 있지 않으므로 컴파일러는 메소드를 "원시" 로 표시합니다. 그런 다음 메소드가 호출될 때 JVM이 메소드를 올바르게 분석합니다.
- 원시 메소드를 구현합니다.
원시 메소드는 로드 가능한 2진 라이브러리에서 외부 시작점으로 구현됩니다. 원시 라이브러리의 컨텐츠는 플랫폼에 특정합니다. JNI는 JVM에서 플랫폼 독립적 방식으로 원시 메소드를 사용하는 방법을 제공합니다.
JVM은 원시 메소드에 대한 호출을 수행합니다. JVM이 원시 메소드에 있는 경우 JNI가 JVM에 "콜백"하는 방법을 제공합니다.
- VM에서 사용할 원시 메소드 코드를 로드합니다.
원시 메소드 선언 이외에 런타임 시 메소드를 포함하는 원시 라이브러리를 찾아 로드해야 합니다.
두 개의 Java 인터페이스가 기본 라이브러리를 로드합니다.
- java.lang.System.load()
- java.lang.System.loadLibrary()
일반적으로 원시 메소드를 선언하는 클래스가 정적 초기자(initializer)에서 원시 라이브러리를 로드합니다.
호출 API
JVM 작성에는 원시 코드가 포함됩니다. 이 목적으로 사용되는 JNI 측면을 JNI 호출 API라고 합니다. 호출 API를 사용하려면 정적으로 또는 동적으로 구현 특정 공유 라이브러리에 바인드하고 해당 라이브러리가 내보내는 JNI_* 함수를 호출합니다.
JNI 스펙 및 구현
JNI 스펙은 선택한 구현 세부사항에 대해 명확하지 않습니다. 단순 및 확장 가능 C 및 C++ 원시 인터페이스에 대한 재사용 가능 프레임워크를 제공합니다. 또한 JNI 모델은 JVMTI 스펙에 대한 기초입니다.
Oracle Corporation 상표 스펙 및 JCK (Java Compatibility Kit) 는 스펙을 준수하지만 구현을 준수하지는 않습니다. 원시 코드는 스펙을 준수해야 하지만 구현에 대해서는 아닙니다. 지정되지 않은 동작에 대해 작성된 코드에는 이식성 및 향후 호환성 문제점이 발생하기 쉽습니다.