JNI
🔌 JNI란?
정의
JNI(Java Native Interface)는 Java 애플리케이션이 C/C++ 같은 네이티브 코드와 상호작용할 수 있게 해주는 인터페이스이다. Java만으로 처리하기 어려운 기능을 네이티브 라이브러리로 연결할 때 사용한다.
🧭 사용하는 목적
- 고성능 연산을 C/C++로 구현한다.
- 기존 네이티브 라이브러리를 재사용한다.
- Java에서 직접 다루기 어려운 OS 기능을 사용한다.
- Java와 C/C++ 사이의 상호 호출을 수행한다.
포인트
JNI는 Java와 네이티브 세계를 잇는 다리라고 보면 이해하기 쉽다.
🧱 기본 동작 방식
Java에서 Native 호출
public class MyNativeApp {
static {
System.loadLibrary("mylib");
}
public native int nativeAdd(int a, int b);
public static void main(String[] args) {
MyNativeApp app = new MyNativeApp();
int result = app.nativeAdd(2, 3);
System.out.println(result);
}
}
C/C++에서 구현
#include <jni.h>
#include "MyNativeApp.h"
JNIEXPORT jint JNICALL Java_MyNativeApp_nativeAdd(JNIEnv *env, jobject obj, jint a, jint b) {
return a + b;
}
🔁 Native에서 Java 호출
JNIEnv* env;
jclass cls = (*env)->FindClass(env, "com/example/MyClass");
jmethodID mid = (*env)->GetMethodID(env, cls, "printMessage", "()V");
(*env)->CallVoidMethod(env, obj, mid);
정리
JNI는 단순히 Java에서 C를 부르는 것뿐 아니라, 네이티브에서 Java를 다시 호출할 수도 있다.
🛠️ 빌드와 실행 흐름
- Java 클래스에
native메서드를 선언한다. javac -h로 헤더 파일을 생성한다.- C/C++로 네이티브 코드를 구현한다.
.dll,.so같은 동적 라이브러리를 만든다.- Java에서
System.loadLibrary()로 로드한다. - 실행한다.
⚠️ 주의할 점
- 네이티브 코드는 디버깅이 어렵다.
- 메모리 관리에 주의해야 한다.
- JVM과 네이티브 코드 사이의 타입 변환을 신경 써야 한다.
- 플랫폼별로 빌드 결과물이 달라질 수 있다.
[!important] 주의 JNI는 강력하지만 복잡도와 유지보수 비용이 높다. 정말 필요한 경우에만 사용하는 것이 좋다.
✅ 활용 예시
- 고속 이미지/영상 처리
- 기존 C/C++ 라이브러리 연동
- 하드웨어 제어
- OS 기능 접근
🧾 정리
JNI는 Java와 네이티브 코드 사이의 연결 통로다. 성능이나 기존 자산 활용에 도움이 되지만, 구조가 복잡해지고 플랫폼 의존성이 커질 수 있다.
댓글남기기