TIL(Today I Learned)

99클럽 코테 스터디 7일차 TIL + JNI (Java Native Interface)

zincah 2025. 4. 9. 07:06
반응형



오늘의 키워드

  • JNI (Java Native Interface)


JNI의 개념 및 활용 예제

자바와 C/C++ 같은 네이티브 언어를 연결해주는 JNI (Java Native Interface) 에 대해 정리해보겠습니다.

JNI는 말 그대로 자바 코드에서 네이티브 라이브러리를 호출하거나, 반대로 네이티브 코드에서 자바 메서드를 호출할 수 있게 해주는 인터페이스입니다.
보통 성능이 중요한 연산을 네이티브로 처리하거나, 운영체제에 특화된 기능을 자바에서 활용하고 싶을 때 사용합니다.

최근에 jni를 접하게된 계기는 회사 선배님이 자바 프로세스 간에 소켓 fd를 전달하는 코드를 구현하고 계셔서 알게 되었습니다. 이를 통해 jni를 활용해서 파일 디스크립터 전달, 성능 개선, 시스템 콜 연동 등 여러 상황에서 사용할 수 있다는 것을 알게 되었습니다.

예제

 

  • native를 호출하는 자바 소스
// HelloJNI.java
package org.example;

public class HelloJNI {
    static {
        System.loadLibrary("hello"); // libhello.dylib (macOS) / libhello.so (Linux)
    }

    public native void sayHello();

    public static void main(String[] args) {
        new HelloJNI().sayHello();
    }
}
  • native C 코드
// org_example_HelloJNI.c
#include <jni.h>
#include <stdio.h>
#include "org_example_HelloJNI.h"

JNIEXPORT void JNICALL Java_org_example_HelloJNI_sayHello(JNIEnv *env, jobject obj) {
    printf("안녕하세요, JNI 세계에 오신 걸 환영합니다!\n");
}


컴파일 및 실행 방법 (macOS & Linux 공통)


프로젝트 디렉토리가 ~/jni_test 라고 가정하겠습니다.

1. 디렉토리 구성

~/jni_test
├── org_example_HelloJNI.c
└── org/example/HelloJNI.java


2. 자바코드 컴파일

cd ~/jni_test
javac -h . org/example/HelloJNI.java


3. 네이티브 라이브러리 컴파일

# 맥

gcc -dynamiclib -I"$JAVA_HOME/include" -I"$JAVA_HOME/include/darwin" \
    -o libhello.dylib org_example_HelloJNI.c
    
# 리눅스

gcc -fPIC -shared -I"$JAVA_HOME/include" -I"$JAVA_HOME/include/linux" \
    -o libhello.so org_example_HelloJNI.c


4. 실행

java -Djava.library.path=. org.example.HelloJNI


오늘의 회고

JNI 라는 개념을 공부하고 간단한 예제와 활용 영역에 대해서 알수 있었습니다.

java와 c언어의 다리 역할을 한다고 하는 말이  딱 맞는 것 같습니다.
jni를 더 활용해서 파일 디스크립터를 넘긴다든가, 콜백을 통해 자바 메서드를 다시 호출하는 예제도 공부해서 정리해볼 생각입니다.

 

반응형