본문 바로가기
java

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

by chunkind 2024. 6. 11.
반응형

자바에서 C 언어 코드를 연동하려면 Java Native Interface (JNI)를 사용해야 합니다. JNI는 자바 코드와 네이티브 코드 (예: C, C++) 간의 상호 작용을 가능하게 합니다. 다음은 JNI를 사용하여 자바와 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 메소드 시그니처와 관련된 부분이므로, 각 단계별로 세부 사항을 주의 깊게 확인하는 것이 중요합니다.

반응형