본문 바로가기
GD's IT Lectures : 기초부터 시리즈/자바(JAVA) 기초부터 ~

[자바(JAVA)] 자바 네이티브 인터페이스 (JNI)

by GDNGY 2023. 4. 28.

24. 자바 네이티브 인터페이스 (JNI)

24.1. JNI 개념 및 목적

자바 네이티브 인터페이스(JNI, Java Native Interface)는 자바 언어와 네이티브(C/C++) 언어 간의 상호 작용을 위한 인터페이스입니다. JNI를 사용하면 자바 애플리케이션에서 C/C++ 함수를 호출하거나 C/C++ 애플리케이션에서 자바 클래스 및 메서드를 호출할 수 있습니다. 이를 통해 자바의 플랫폼 독립성을 유지하면서도 하드웨어의 특성을 활용하는 네이티브 코드를 사용할 수 있습니다.

 

24.2. JNI 프로그래밍 방법

JNI를 사용하여 자바와 C/C++ 코드를 연동하는 과정은 크게 3단계로 구성됩니다.

  1. 자바에서 JNI를 사용할 수 있는 클래스를 작성합니다.
  2. C/C++ 코드에서 JNI 함수를 사용하여 자바 클래스 및 메소드를 호출합니다.
  3. C/C++ 코드를 컴파일하여 JNI 라이브러리를 생성하고, 자바에서 이 라이브러리를 로드하여 사용합니다.

 

24.3. C/C++과 자바 코드 연동

C/C++ 코드에서 자바 클래스 및 메소드를 호출하기 위해서는 다음과 같은 순서로 진행합니다.

  1. JVM을 초기화하고 자바 클래스를 로드합니다.
  2. 자바 클래스의 메소드 ID를 얻습니다.
  3. 메서드를 호출하고 결과를 반환합니다.

이를 위해 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를 사용할 수 있습니다.

반응형

댓글