자바에서 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 메소드 시그니처와 관련된 부분이므로, 각 단계별로 세부 사항을 주의 깊게 확인하는 것이 중요합니다.