24. 자바 네이티브 인터페이스 (JNI)
24.1. JNI 개념 및 목적
자바 네이티브 인터페이스(JNI, Java Native Interface)는 자바 언어와 네이티브(C/C++) 언어 간의 상호 작용을 위한 인터페이스입니다. JNI를 사용하면 자바 애플리케이션에서 C/C++ 함수를 호출하거나 C/C++ 애플리케이션에서 자바 클래스 및 메서드를 호출할 수 있습니다. 이를 통해 자바의 플랫폼 독립성을 유지하면서도 하드웨어의 특성을 활용하는 네이티브 코드를 사용할 수 있습니다.
24.2. JNI 프로그래밍 방법
JNI를 사용하여 자바와 C/C++ 코드를 연동하는 과정은 크게 3단계로 구성됩니다.
- 자바에서 JNI를 사용할 수 있는 클래스를 작성합니다.
- C/C++ 코드에서 JNI 함수를 사용하여 자바 클래스 및 메소드를 호출합니다.
- C/C++ 코드를 컴파일하여 JNI 라이브러리를 생성하고, 자바에서 이 라이브러리를 로드하여 사용합니다.
24.3. C/C++과 자바 코드 연동
C/C++ 코드에서 자바 클래스 및 메소드를 호출하기 위해서는 다음과 같은 순서로 진행합니다.
- JVM을 초기화하고 자바 클래스를 로드합니다.
- 자바 클래스의 메소드 ID를 얻습니다.
- 메서드를 호출하고 결과를 반환합니다.
이를 위해 JNI에서 제공하는 함수들을 사용합니다. 아래는 C/C++ 코드에서 JNI를 사용하여 자바 클래스의 static 메서드를 호출하는 예제입니다.
// 자바 클래스
public class MyClass {
public static void myMethod(String str) {
System.out.println(str);
}
}
// C/C++ 코드
#include <jni.h>
JNIEXPORT void JNICALL Java_MyClass_myMethod(JNIEnv *env, jclass clazz, jstring str) {
const char *cstr = env->GetStringUTFChars(str, nullptr);
printf("%s\n", cstr);
env->ReleaseStringUTFChars(str, cstr);
}
위 코드에서는 JNIEXPORT 매크로를 사용하여 C/C++ 함수를 JNI 함수로 지정합니다. JNI 함수의 이름은 "Java_패키지명_클래스명_메소드명" 형식으로 지정합니다. JNIEnv *env는 JNI 함수에서 사용할 수 있는 환경 변수를 제공합니다. jclass clazz는 자바 클래스를 나타내는 객체입니다. jstring str은 자바 문자열입니다.
24.4. JNI 라이브러리 생성 및 사용
C/C++ 코드를 컴파일하여 JNI 라이브러리를 생성하고, 자바에서 이 라이브러리를 로드하여 사용할 수 있습니다.
C/C++ 코드를 컴파일하기 위해서는 다음과 같은 절차로 진행합니다.
1. 자바 환경 변수를 설정합니다.
export JAVA_HOME=/usr/local/jdk
export PATH=$JAVA_HOME/bin:$PATH
2. JNI 헤더 파일(jni.h)과 자바 헤더 파일(jni_md.h)을 include할 수 있도록 환경 변수를 설정합니다.
export CPLUS_INCLUDE_PATH=$JAVA_HOME/include:$JAVA_HOME/include/linux
3. C/C++ 코드를 컴파일합니다.
gcc -shared -fPIC -o libmylib.so MyCode.c -I$JAVA_HOME/include -I$JAVA_HOME/include/linux
4. 자바에서 JNI 라이브러리를 로드하여 사용합니다.
System.loadLibrary("mylib");
// 자바에서 JNI 함수 호출
native void myMethod();
위의 코드에서는 System.loadLibrary() 함수를 사용하여 JNI 라이브러리를 로드합니다. 자바에서 JNI 함수를 호출할 때는 native 키워드를 사용하여 메서드를 정의합니다.
JNI는 자바와 C/C++ 코드 간의 상호 작용을 지원하므로, 다양한 분야에서 활용됩니다. 예를 들어, 그래픽 라이브러리나 네이티브 라이브러리를 사용하는 게임 개발, 하드웨어와 연동하는 드라이버 개발 등에서 JNI를 사용할 수 있습니다.
'GD's IT Lectures : 기초부터 시리즈 > 자바(JAVA) 기초부터 ~' 카테고리의 다른 글
[자바(JAVA)] 자바와 웹 프로그래밍 (0) | 2023.04.30 |
---|---|
[자바(JAVA)] 자바와 XML 처리 (0) | 2023.04.30 |
[자바(JAVA)] 메모리 관리와 가비지 컬렉션 (0) | 2023.04.28 |
[자바(JAVA)] 자바 어노테이션 (0) | 2023.04.28 |
[자바(JAVA)] Reflection API (0) | 2023.04.28 |
댓글