Java Native Interface의 약자입니다.
Java는 JVM이라는 독립적인 플랫폼을 통해 컴파일 / 동작하기 때문에, 하드웨어에 직접 접근하여 코드를 실행하는 네이티브 코드의 사용이 어렵습니다.
이에 JAVA <-> 네이티브 코드끼리 서로 호출할 수 있도록 도와주는 프레임워크가 JNI 입니다.
JNI를 사용하는 이유는 크게 세가지가 있습니다.
public class JniTest {
public native void nativeMethod();
static {
System.loadLibrary("jni_test");
}
public static void main(String[] args) {
new JniTest().nativeMethod();
}
}
위 코드처럼, 예약어 'native' 를 사용하게 되면 해당 메서드가 네이티브 라이브러리에서 구현됨을 의미합니다.
객체 생성 후 nativeMethod 메서드를 호출하게 되면, 네이티브 코드가 호출됩니다.
네이티브 코드를 호출하는 JAVA 코드를 먼저 작성한 이유는,
JNI 연결을 위한 헤더파일을 만들 때, Java의 파일이 지정되어야 하기 때문입니다.
그럼 다음으로 네이티브 코드를 작성하는 방법은 다음과 같습니다.
javac -h . JniTest.java
위 bash 코드를 실행하게 되면, JniTest.h 파일이 생성됩니다.
#include <jni.h>
#include <stdio.h>
#include "JniTest.h"
JNIEXPORT void JNICALL Java_JniTest_sayHello(JNIEnv *env, jobject obj) {
printf("C에서 호출됨 !\n");
}
위에서 만든 헤더파일을 참조하는 C언어 코드를 다음 형식과 같이 작성합니다.
이후 만든 파일들을 빌드해주면 완료입니다.
플랫폼 별 명령어가 다르니, 참고 부탁드립니다.
MAC or Linux
gcc -shared -fpic -o libjnitest.so -I"$JAVA_HOME/include" -I"$JAVA_HOME/include/darwin" JniTest.c
Windows
gcc -shared -o jnitest.dll -I"%JAVA_HOME%\include" -I"%JAVA_HOME%\include\win32" JniTest.c
이후 자바 코드를 실행해보면, 원하는 출력 결과가 보이는 것을 확인할 수 있습니다.