목차
- 자바 JNI C 코드 so 라이브러리 생성 및 함수 호출 예제 이전 포스팅 참고 학습
- 자바 JNI 포인터 활용 예제 이전 포스팅 참고 학습
- 자바 javac 사용하여 java 소스 코드 컴파일 및 class 파일 생성하기 이전 포스팅 참고 학습
- 자바 JNI C 자바로부터 시간 초 입력받아 카운팅 스레드 생성 후 시간 초과시 자바 메소드 호출 예제
- 자바 JNI 자바에서 C 함수 호출하여 결과 출력 예제
자바 JNI C 코드 so 라이브러리 생성 및 함수 호출 예제 이전 포스팅 참고 학습
이전 포스팅에서는 항목에서는 자바 네이티브 인터페이스 (JNI)를 사용하여 C 코드를 자바에서 호출하고, C 코드를 라이브러리로 빌드하는 방법을 학습하였습니다. 이를 통해 C와 자바 간의 상호 운용성을 구현할 수 있습니다. 이러한 방법은 자바에서 포인터와 같은 C의 기능을 사용할 수 없는 단점을 보완시켜줍니다. 따라서 자바에서 JNI를 통해 C 함수를 호출하고 싶으신 분은 아래 링크를 참고해주세요.
2023.09.18 - [Java] - [Java/C] 자바에서 C 사용을 위한 JNI 소스코드 컴파일 및 라이브러리 생성 예제(so 라이브러리)
자바 JNI 포인터 활용 예제 이전 포스팅 참고 학습
다음으로 이전 포스팅에서는 JNI를 사용하여 C 코드에서 포인터를 활용하는 방법을 배우고, 이를 자바로 호출하는 방법을 알아보았습니다. 포인터를 사용하여 메모리를 효과적으로 관리할 수 있습니다. 만약 자바에서 C 함수를 호출해야할 필요가 있으시다면 아래 링크를 참고하여 JNI C를 활용해보세요.
2023.09.19 - [Java] - [Java/C] 자바 JNI malloc, free 활용 메모리 동적 할당 변수 생성,삭제,값 저장 예제(포인터)
자바 javac 사용하여 java 소스 코드 컴파일 및 class 파일 생성하기 이전 포스팅 참고 학습
마지막으로 이전 포스팅에서는 자바 컴파일러인 javac를 사용하여 자바 소스 코드를 컴파일하고, 컴파일된 클래스 파일을 생성하는 방법을 알아보았습니다. 본 블로그의 자바 포스팅 예제를 실행하기 위해서는 javac 활용 방법을 반드시 알아야합니다. 아직 javac로 자바 소스 코드 컴파일 방법을 모르신다면 아래 링크를 참고하여 학습해주세요.
2023.08.10 - [Linux] - [Linux/Java] 리눅스 우분투에서 java 컴파일 및 실행 예제(javac)
자바 JNI C 자바로부터 시간 초 입력받아 카운팅 스레드 생성 후 시간 초과시 자바 메소드 호출 예제
아래는 자바에서 C 함수를 호출하여 시간 초를 입력받고, 해당 초 동안 카운팅하는 스레드를 생성하는 예제입니다. 시간 초과 시 자바 메소드를 호출합니다.
#include <jni.h>
#include <stdio.h>
#include <pthread.h>
#include <unistd.h>
// Java class and method references
static jclass countdownTimerClass;
static jmethodID onCountdownFinishedMethod;
static JavaVM* jvm;
// Countdown function
void* countdown(void* arg) {
JNIEnv* env;
(*jvm)->AttachCurrentThread(jvm, (void**)&env, NULL);
int sec = *(int*)arg;
for (int i = sec; i > 0; i--) {
sleep(1); // Sleep for 1 second
}
// Call the Java method when countdown finishes
(*env)->CallStaticVoidMethod(env, countdownTimerClass, onCountdownFinishedMethod);
(*jvm)->DetachCurrentThread(jvm);
return NULL;
}
// Java native method to start the countdown
JNIEXPORT void JNICALL Java_CountdownTimer_startTimer(JNIEnv* env, jobject obj, jint sec) {
jclass cls = (*env)->GetObjectClass(env, obj);
countdownTimerClass = (*env)->NewGlobalRef(env, cls);
onCountdownFinishedMethod = (*env)->GetMethodID(env, cls, "onCountdownFinished", "()V");
if (onCountdownFinishedMethod == NULL) {
return; // Method not found
}
// Create a pthread to start the countdown
pthread_t tid;
pthread_create(&tid, NULL, countdown, &sec);
pthread_detach(tid);
}
JNIEXPORT jint JNICALL JNI_OnLoad(JavaVM* vm, void* reserved) {
jvm = vm;
return JNI_VERSION_1_6;
}
아래와 같이 컴파일합니다.
$ gcc -shared -o libCountdownTimer.so -I${JAVA_HOME}/include -I${JAVA_HOME}/include/linux CountdownTimer.c -lpthread -fPIC
자바 JNI 자바에서 C 함수 호출하여 결과 출력 예제
아래는 자바에서 C 함수를 호출하고, C 함수에서 스레드를 생성하고 시간이 경과되면 자바 메소드를 호출하는 예제입니다.
public class CountdownTimer {
static {
System.loadLibrary("CountdownTimer");
}
public native void startTimer(int sec);
public void onCountdownFinished() {
System.out.println("Countdown Finished!");
}
public static void main(String[] args) {
CountdownTimer timer = new CountdownTimer();
timer.startTimer(5); // Start timer for 5 seconds
}
}