맥에서 Hello JNI!를 출력하는 Java 응용프로그램을 개발해 보자. 단 이 응용프로그램은 문자열을 출력하는 부분을 C++ 로 작성할 것이다.
네이티브 라이브러를 사용하는 Java 클래스 작성하기
$ vi HelloJNI.java
// 주의! 학습 편의를 위해서 패키지를 작성하지 않는다!
class HelloJNI {
private native void print();
public static void main(String[] args) {
new HelloJNI().print();
}
static {
System.loadLibrary("HelloJNI");
}
}
java 코드 파일을 컴파일하여 class파일을 만든다.
$ javac HelloJNI.java
JNI C++ 파일을 만들기 위해서 javah를 이용해 C++ 헤더파일을 만든다.
$ javah -jni HelloJNI
만들어진 파일을 확인해 보자
$ cat HelloJNI.h
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class HelloWorld */
#ifndef _Included_HelloJNI
#define _Included_HelloJNI
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: HelloJNI
* Method: print
* Signature: ()V
*/
JNIEXPORT void JNICALL Java_HelloJNI_print
(JNIEnv *, jobject);
#ifdef __cplusplus
}
#endif
#endif
JNI 함수명과 인자타입 등은 관련 문서를 참고한다. Java_HelloJNI_print 함수를 작성한다.
컴파일하면 HelloJNI.o 파일이 생성된다. 이제 동적라이브러리를 생성한다. 라이브러리명은 반드시 lib으로 시작해야 하고 확장자는 jnilib 이여야 한다. 위 컴파일문에서 jni.h를 찾을 수 없다는 오류가 발생하면 jni.h 가 있는 곳을 찾아서 적어줘야 한다. 아래처럼 심볼링 링크를 직접 만들어서 사용해야 한다. 예를 들어 /System/Library/Java/JavaVirtualMachines/Headers 폴더를 만든 후 해당 폴더로 이동한 다음 아래의 명령어를 실행한다.