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 |