본문 바로가기

웹프로그래밍/java

자바에서 네이티브 코드(c, c++) 연동하기

자바에서 C 언어 코드를 연동하려면 Java Native Interface (JNI)를 사용해야 합니다. JNI는 자바 코드와 네이티브 코드 (예: C, C++) 간의 상호 작용을 가능하게 합니다. 다음은 JNI를 사용하여 자바와 C 코드를 연동하는 기본적인 과정입니다.

 

c코드 작성 → 자바 클래스 작성 자바파일 컴파일 및 헤더 파일 생성 C코드 컴파일 자바프로그램 실행

 

 

1. C코드 작성

먼저, C로 작성된 네이티브 라이브러리를 만듭니다. 이 코드는 자바에서 호출할 수 있는 네이티브 메소드를 정의합니다.

HelloWorld.c
#include <jni.h>
#include <stdio.h>

JNIEXPORT void JNICALL Java_HelloWorld_sayHello(JNIEnv *env, jobject obj) {
    printf("Hello from C!\n");
}

 

2. 자바 클래스 작성

네이티브 메소드를 선언한 자바 클래스를 작성합니다. 이 클래스에서는 네이티브 메소드가 정의되어 있지 않으며, 대신 네이티브 메소드가 있음을 JNI에 알려줍니다.

 

HelloWorld.java
public class HelloWorld {
     // 네이티브 메소드 선언
     private native void sayHello();

     static {
         // 네이티브 라이브러리 로드
         System.loadLibrary("hello");
     }

     public static void main(String[] args) {
         new HelloWorld().sayHello(); // 네이티브 메소드 호출
     }
 }

 

3. 자바파일 컴파일 및 헤더 파일 생성

javac를 사용하여 자바 파일을 컴파일한 후, javah 도구를 사용하여 네이티브 메소드를 위한 C 헤더 파일을 생성합니다.

 

javac HelloWorld.java
javah -jni HelloWorld

 

이렇게 하면 HelloWorld.h 파일이 생성됩니다.

 

4. C 코드 컴파일

C 코드를 컴파일하여 네이티브 라이브러리를 만듭니다. OS에 따라 컴파일 명령이 다릅니다.

 

- Windows

  gcc -shared -o hello.dll -I"%JAVA_HOME%\include" -I"%JAVA_HOME%\include\win32" HelloWorld.c

 

- Linux

gcc -shared -o libhello.so -I"$JAVA_HOME/include" -I"$JAVA_HOME/include/linux" HelloWorld.c

 

- MacOS

gcc -shared -o libhello.dylib -I"$JAVA_HOME/include" -I"$JAVA_HOME/include/darwin" HelloWorld.c

 

5. 자바 프로그램 실행

생성된 네이티브 라이브러리가 자바 프로그램이 실행되는 디렉토리에 있어야 합니다. 자바 프로그램을 실행하여 네이티브 메소드가 제대로 호출되는지 확인합니다.

 

java -Djava.library.path=. HelloWorld

 

위의 단계들을 수행하면 자바에서 C 코드를 성공적으로 연동하여 사용할 수 있습니다. 이 과정에서 발생할 수 있는 문제는 보통 네이티브 라이브러리를 로드하는 부분이나 JNI 메소드 시그니처와 관련된 부분이므로, 각 단계별로 세부 사항을 주의 깊게 확인하는 것이 중요합니다.

 

 

 

 


 

반응형