[JAVA]JVM이란?(4)-JNI

bbbbbhyun·2025년 2월 19일
0

JAVA

목록 보기
5/5

JNI(JVM Native Interface)

정의

  • Java 코드에서 네이티브 코드(C, C++, 어셈블리 등) 호출을 가능하게 하는 인터페이스
  • 네이티브 코드에서 Java의 클래스, 메서드, 필드를 접근 가능하게 함
  • 플랫폼 종속적 → 운영체제(OS)별로 다르게 구현될 수 있음
  • JVM과 네이티브 코드 간의 데이터 변환 및 메모리 관리 필요

사용 목적

  1. 기존 네이티브 라이브러리 활용 → C, C++로 작성된 라이브러리를 Java에서 사용 가능
  2. 성능 최적화 → 일부 연산을 C++로 구현하여 속도 향상 가능
  3. 하드웨어 및 OS API 접근 → Java가 직접 접근할 수 없는 네이티브 API 호출
  4. 레거시 시스템 연동 → 기존 C/C++ 코드와 Java 애플리케이션을 연동

주요 요소

  1. JNIEnv
  • JNIEnv *env는 Java와 C/C++ 간의 다리 역할을 하는 인터페이스
  • Java 객체, 클래스, 메서드를 접근하고 호출하는 다양한 기능 제공
  • 예제
const char *className = "java/lang/String";
jclass stringClass = (*env)->FindClass(env, className);
  1. jobject (Java 객체)
  • jobject는 Java 객체를 참조하는 포인터
  • Java 객체를 C/C++에서 조작할 수 있도록 함
  • 예제
jclass clazz = (*env)->GetObjectClass(env, obj);
jmethodID methodID = (*env)->GetMethodID(env, clazz, "someMethod", "()V");
(*env)->CallVoidMethod(env, obj, methodID);
  1. 데이터 변환
  • Java와 C/C++ 간 데이터 변환이 필요함

    Java JNI
    int jint
    boolean jboolean
    String jstring
    Object jobject
  • 예제(java string -> c char*)

jstring jstr = (*env)->NewStringUTF(env, "Hello JNI");
const char *cstr = (*env)->GetStringUTFChars(env, jstr, NULL);
printf("%s\n", cstr);
(*env)->ReleaseStringUTFChars(env, jstr, cstr);

장단점

  • 장점

    • 기존 네이티브 라이브러리를 Java에서 활용 가능
    • Java의 성능을 높이기 위해 C/C++의 빠른 실행 속도 활용 가능
    • 하드웨어 및 OS API에 직접 접근 가능
  • 단점

    • 플랫폼 종속적 (OS마다 다른 라이브러리 필요)
    • 메모리 관리 필요 (C/C++의 메모리 할당 및 해제 직접 수행)
    • 예외 처리가 복잡 (Java 예외를 네이티브 코드에서 처리 어려움)

동작 과정

  1. 네이티브 메서드 선언 (Java)
public class NativeExample {
    static {
        System.loadLibrary("nativeLib"); 
    }

    public native void sayHello();

    public static void main(String[] args) {
        new NativeExample().sayHello(); 
    }
}
  1. JNI 헤더 파일 생성 (javac + javah)
    1. javac NativeExample.java
    2. javac -h . NativeExample.java
      2-1 예시
#include <jni.h>
#ifndef _Included_NativeExample
#define _Included_NativeExample
#ifdef __cplusplus
extern "C" {
#endif
    JNIEXPORT void JNICALL Java_NativeExample_sayHello(JNIEnv *, jobject);
#ifdef __cplusplus
}
#endif
#endif
  1. C/C++ 구현 (네이티브 메서드 작성)
  • 예시
#include <jni.h>
#include <stdio.h>
#include "NativeExample.h"

// 네이티브 메서드 구현
JNIEXPORT void JNICALL Java_NativeExample_sayHello(JNIEnv *env, jobject obj) {
    printf("Hello from C!\n");
}
  1. 네이티브 라이브러리 컴파일

  2. Java 실행

  • 실행 명령어
    - java NativeExample
  • 출력 예시
    - Hello from C!

참고

https://velog.io/@cksgh1224/JNI-%EC%82%AC%EC%9A%A9%ED%95%98%EA%B8%B0
https://velog.io/@vrooming13/JNI-JAVA-Native-Interface
https://hbase.tistory.com/82
https://www.ibm.com/docs/ko/sdk-java-technology/8?topic=jni-overview
https://modelmaker.tistory.com/entry/JNI%EC%99%80-JNI%EC%97%90%EC%84%9C-java-%EC%BD%94%EB%93%9C%EC%97%90-%EC%A0%91%EA%B7%BC%ED%95%98%EB%8A%94-%EB%B0%A9%EB%B2%95%EB%93%A4-Java-Native-Interface

profile
BackEnd develope

0개의 댓글

관련 채용 정보