JNI(Java Native Interface)
JDK의 일부분이자 자바를 위한 네이티브 프로그래밍 인터페이스이다. JNI를 사용해 코드가 모든 플랫폼 상에서 완벽히 이식되도록 할 수 있다. JNI는 C/C++로 쓰여진 애플리케이션이나 라이브러리가 자바 가상 머신과 상호작동하도록 하고 자바 코드가 자바 가상 머신 내에서 실행되도록 보장한다.
JNI의 쓰임
- 표준 자바 클래스 라이브러리가 플랫폼 의존적 틍징들을 지원하지 못할 때.
- 이미 다른 언어로 쓰여진 애플리케이션이나 라이브러리를 자바 애플리케이션에서 접근하고자 할 때.
- 저수준 언어로 구현한 코드를 자바 애플리케이션에서 호출하고자 할 때.
Android가 관리 코드에서 컴파일하는 바이트 코드(Java, Kotlin)와 네이티브 코드(C/C++)가 상호작용하는 방법을 정의한다. JNI는 동적 공유 라이브러리에서 코드를 로드하로독 지원한다. 자바 코드가 자바 객체를 이용할 수 있는 것처럼, 네이티브 코드도 자바 객체를 이용하도록 할 수 있다. 네이티브 코드는 자바 객체를 만들고 검사하고 업데이트 할 수 있으며, 자바 메소드를 쉽게 호출할 수 있다. 또한, 네이티브 코드에서 예외를 catch하거나 throw할 수 있으며, 자바 클래스에 대한 정보를 얻고 로드할 수도 있다. (+ 런타임 체크도 가능)
JNI를 Invocation API와 함께 사용해서 임의의 네이티브 어플리케이션으로 Java VM을 포함할 수 있다. 이를 통해서 프로그래머는 VM 소스 코드와 연결하지 않고도 기존 응용 프로그램을 Java에서 쉽게 사용할 수 있다.
JNI 사용 예시
네이티브 코드(C,C++)를 자바에서 사용하려면 네이티브 메소드를 정의해야한다.
public class jzziqw {
public static native void print();
static {
System.loadLibrary("jzziqw");
}
public static void main(String args[]) {
jzziqw.print();
}
}
위의 코드처럼 method boy를 갖지 않은 메소드를 네이티브 키워드를 통해 정의한다. 메소드의 바디는 C/C++ 코드의 dll(.so/unix) 파일로 되어있다.
javac jzziqw.java
코드를 컴파일하고, 실행하면 당연하게도 에러가 발생한다.
javah -jni -classpath . -o jzziqw.h jzziqw
네이티브 메소드를 C/C++로 구현하기 위해 자바 메소드 선언을 C/C++ 메소드 선언으로 매핑시킨다.
이를 위해 위처럼 핸들러 파일을 생성하는 javah 명령어를 사용한다.
#ifndef _Included_jzziqw
#define _Included_jzziqw
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: jzziqw
* Method: print
* Signature: ()V
*/
JNIEXPORT void JNICALL Java_jzziqw_print
(JNIEnv *, jclass);
#ifdef __cplusplus
}
#endif
#endif
Java_jzziqw_print 함수는 JNIEnv *, jclass 두 개의 인수를 가지는데 이 두 개의 인수가 모든 JNI 호출에 추가된다.
첫 번째 인수는 JVM 영역에, 두 번째 인수는 클래스를 참조하는데 사용된다.
추가적으로 자바 핸들러 명령어 'javah'의 옵션은 다음과 같다.
- -o: 출력할 파일의 이름을 지정
- -d: 출력 디렉토리 지정
- -jni: JNI 스타일의 헤더를 생성
- -td: 작업을 임시 디렉토리에 저장
- -stubs: stub 파일 생성
- -trace: stub 파일에 추적 정보 추가
- -verbose: 작업에 대한 자세한 정보 출력
- -classpath: 클래스 경로 지정. (디렉토리는 ;로 분리)
- -version: 빌드 버전 출력
참고 자료
'Android > 필기' 카테고리의 다른 글
Android OS 부팅 순서와 자료 구조 (0) | 2023.03.16 |
---|---|
NDK(Native Development Kit) 개요 및 사용법 (0) | 2023.03.11 |
안드로이드 - JAVA, Kotlin (0) | 2023.03.11 |
디컴파일의 개요, 원리 및 이유 (+Apktool) (0) | 2023.03.11 |
안드로이드의 개요, 4대 구성 요소(+240720 수정) (0) | 2023.03.11 |