JNI(Java Native Interface) 개요 및 사용법

728x90

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: 빌드 버전 출력

참고 자료

 

728x90