본문 바로가기
언어/Java

JNI

by svcbn 2025. 12. 12.

12/10

 

 

JNI

JNI 는 Java Navtive Interface 로, 자바 가상 머신(JVM) 에서 실행되는 Java 코드가 C, C++ 같은 네이티브 애플리케이션 및 라이브러리와 상호 운용할 수 있도록 해주는 프로그래밍 프레임워크이다.
안드로이드에서는 NDK(Native Development Kit) 을 제공하여 Native 언어를 사용할 수 있도록 지원하는 중.

 

목적

플랫폼별  기능 활용
표준 Java 클래스 라이브러리가 지원하지 않는, 하드웨어 또는 운영 체제 플랫폼별 기능(e.g. 특정 I/O, 스레딩, 네트워킹 기능 등) 에 접근할 수 있다.

기존 네이티브 코드 재사용
이미 다른 언어로 작성된 방대한 양의 기존 라이브러리나 레거시 코드를, Java 애플리케이션 내에서 재사용할 수 있게 된다.

성능 향상
시간 소모가 많은 복잡한 계산이나, 성능이 중요한 코드 부분을 C/C++ 같은 저수준 언어로 구현하여 성능 최적화 가능.

시스템 리소스 직접 조작
Java 코드만으로는 직접 조작하기 어려운 시스템 리소스나 하드웨어에 접근할 수 있는 다리 역할.

 

작동 방식

JNI 를 사용하면, Java 코드에서 native 키워드를 사용하여 네이티브 메소드를 선언하고, 이 메소드의 실제 구현은 동적 라이브러리 (.dll, .so 등) 내에 C/C++ 코드로 작성된다. Java 애플리케이션이 실행될 때 System.loadLibrary() 메소드를 통해 이 동적 라이브러리를 메모리로 로드하고, JNI 가 Java 메소드 호출과 네이티브 함수 구현 사이를 연결해 주는 식.

public class HelloJNI {
    static {
        // 네이티브 라이브러리를 로드합니다. (예: Windows에서는 libhello.dll, Linux에서는 libhello.so)
        System.loadLibrary("hello"); 
    }

    // C/C++에서 구현될 네이티브 메서드를 선언합니다.
    public native void sayHello(); 

    public static void main(String[] args) {
        HelloJNI jni = new HelloJNI();
        jni.sayHello();
    }
}

 

javac 명령어의 실행을 통해, JNI 를 사용하기 위한 헤더 파일을 만들 수 있고,

javac -h {헤더파일을 둘 위치} {***.java 의 경로}

javac -h . HelloJNI.java

 

이 헤더 파일을 바탕으로 C/C++ 소스 파일에서 실제 네이티브 코드를 구현하게 된다.

/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class HelloJNI */

#ifndef _Included_HelloJNI
#define _Included_HelloJNI
#ifdef __cplusplus
extern "C" {
#endif
/*
 * Class:     HelloJNI
 * Method:    sayHello
 * Signature: ()V
 */
JNIEXPORT void JNICALL Java_HelloJNI_sayHello
  (JNIEnv *, jobject);

#ifdef __cplusplus
}
#endif
#endif

헤더 파일의 구성을 살펴보면,
#include <jni.h> : JNI 관련 기본 정의 및 함수 선언이 포함된 핵심 헤더 파일.

그 밑으로가 Java 의 네이티브 메서드 sayHello() 에 매핑되는 C 함수 시그니처로,
JNIEXPORT / JNICALL : 플랫폼 간 호환성을 위한 JNI 매크로.
Java_HelloJNI_sayHello : JNI 명명 규칙에 따른, Java_ 접두사, 클래스 이름(HelloJNI), 메서드 이름(sayHello) 순서로 구성.
JNIEnv * : JNI 환경 인터페이스에 대한 포인터로, 네이티브 코드에서 JVM 기능을 호출할 때 사용.
jobject  : 네이티브 메서드를 호출한 자바 객체(this) 에 대한 참조.

'언어 > Java' 카테고리의 다른 글

@Keep  (0) 2026.01.12
final / @override  (0) 2025.12.22
Maven  (0) 2025.12.13