🔌 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를 다시 호출할 수도 있다.

🛠️ 빌드와 실행 흐름

  1. Java 클래스에 native 메서드를 선언한다.
  2. javac -h로 헤더 파일을 생성한다.
  3. C/C++로 네이티브 코드를 구현한다.
  4. .dll, .so 같은 동적 라이브러리를 만든다.
  5. Java에서 System.loadLibrary()로 로드한다.
  6. 실행한다.

⚠️ 주의할 점

  • 네이티브 코드는 디버깅이 어렵다.
  • 메모리 관리에 주의해야 한다.
  • JVM과 네이티브 코드 사이의 타입 변환을 신경 써야 한다.
  • 플랫폼별로 빌드 결과물이 달라질 수 있다.

[!important] 주의 JNI는 강력하지만 복잡도와 유지보수 비용이 높다. 정말 필요한 경우에만 사용하는 것이 좋다.

✅ 활용 예시

  • 고속 이미지/영상 처리
  • 기존 C/C++ 라이브러리 연동
  • 하드웨어 제어
  • OS 기능 접근

🧾 정리

JNI는 Java와 네이티브 코드 사이의 연결 통로다. 성능이나 기존 자산 활용에 도움이 되지만, 구조가 복잡해지고 플랫폼 의존성이 커질 수 있다.


연결문서

댓글남기기