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를 더 활용해서 파일 디스크립터를 넘긴다든가, 콜백을 통해 자바 메서드를 다시 호출하는 예제도 공부해서 정리해볼 생각입니다.
반응형