목차
- 자바 javac 활용 자바 소스코드 컴파일하기 이전 포스팅 참고 학습
- 자바 JNI C so 라이브러리 만들기 이전 포스팅 참고 학습
- 자바 JNI C 라이브러리의 함수 호출하기 이전 포스팅 참고 학습
- 자바 JNI malloc, free 활용한 4byte 정수 변수 생성, 삭제, 값 저장, 가져오기 함수 만들기 예제
- 자바 JNI 자바에서 C 라이브러리로 동적 할당 4byte 변수 활용 예제
자바 javac 활용 자바 소스코드 컴파일하기 이전 포스팅 참고 학습
자바 개발에서 가장 기본적인 작업 중 하나는 자바 소스 코드를 컴파일하여 실행 가능한 바이트 코드로 변환하는 것입니다. 이를 위해 javac라는 컴파일러를 사용하며, 컴파일된 클래스 파일은 JVM(Java Virtual Machine)에서 실행됩니다. 자바 소스 코드를 수정한 경우 반드시 컴파일 단계를 거쳐야 합니다. 이전 포스팅에서는 이러한 자바 소스 코드를 javac 명령으로 컴파일하는 방법과 예제에 대해 알아보았습니다. 만약 리눅스 환경에서 자바 소스 코드 컴파일 방법이 궁금하시다면 아래 링크를 참고해주세요.
2023.08.10 - [Linux] - [Linux/Java] 리눅스 우분투에서 java 컴파일 및 실행 예제(javac)
자바 JNI C so 라이브러리 만들기 이전 포스팅 참고 학습
이전 포스팅에서는 JNI(Java Native Interface)를 사용하여 C 라이브러리를 만드는 방법에 대해 알아보았습니다. JNI를 통해 자바에서 C 언어로 작성된 함수를 호출하거나, C 라이브러리를 자바 애플리케이션에 통합할 수 있습니다. 특히 C의 장점인 포인터 사용과 메모리를 동적할당 할 수 있다는 점에서 자바에서 이러한 장점을 그대로 사용할 수 있습니다. 자바에서 C를 사용하기 위한 so 라이브러리 빌드 방법이 궁금하시다면 아래 링크를 참고해주세요.
2023.09.18 - [Java] - [Java/C] 자바에서 C 사용을 위한 JNI 소스코드 컴파일 및 라이브러리 생성 예제(so 라이브러리)
자바 JNI C 라이브러리의 함수 호출하기 이전 포스팅 참고 학습
마지막으로 이전 포스팅에서는 JNI를 활용하여 자바에서 C로 작성된 라이브러리 함수를 호출하는 방법에 대해 알아보았습니다. 자바 어플리케이션에서 JNI를 사용하여 C 라이브러리를 로드하고, C 함수를 자바에서 호출하는 예제를 살펴보세요. 특히 포인터를 사용하는 함수를 구현하면 자바에서 조금더 리소스를 효율적으로 사용할 수 있습니다. 해당 내용이 궁금하시다면 아래 링크를 참고해주세요.
2023.09.18 - [Java] - [Java/C] 자바에서 JNI 연동으로 C 라이브러리 함수 호출 및 반환 값 출력 예제
자바 JNI malloc, free 활용한 4byte 정수 변수 생성, 삭제, 값 저장, 가져오기 함수 만들기 예제
아래는 JNI를 사용하여 C 코드에서 동적으로 4바이트 정수 변수를 생성하고, 값을 저장하고, 가져오며, 삭제하는 예제입니다. 해당 코드를 활용하여 so 라이브러리를 생성합니다.
// pointer.c
#include <jni.h>
#include <stdlib.h>
JNIEXPORT jlong JNICALL Java_com_example_JNIDemo_mallocInt(JNIEnv *env, jclass cls) {
int* intArray = (int*)malloc(sizeof(int));
if (intArray == NULL) {
jclass exceptionClass = (*env)->FindClass(env, "java/lang/OutOfMemoryError");
(*env)->ThrowNew(env, exceptionClass, "Failed to allocate memory");
return 0;
}
return (jlong)intArray;
}
JNIEXPORT void JNICALL Java_com_example_JNIDemo_setValue(JNIEnv *env, jclass cls, jlong ptr, jint value) {
int* intArray = (int*)ptr;
if (intArray != NULL) {
*intArray = (int)value;
}
}
JNIEXPORT jint JNICALL Java_com_example_JNIDemo_getValue(JNIEnv *env, jclass cls, jlong ptr) {
int* intArray = (int*)ptr;
if (intArray != NULL) {
return (jint)(*intArray);
}
return 0;
}
JNIEXPORT void JNICALL Java_com_example_JNIDemo_freeInt(JNIEnv *env, jclass cls, jlong ptr) {
int* intArray = (int*)ptr;
if (intArray != NULL) {
free(intArray);
}
}
그리고 아래와 같이 컴파일하여 so 라이브러리를 생성합니다.
$ gcc -shared -o libpointer.so -I"$JAVA_HOME/include" -I"$JAVA_HOME/include/linux" pointer.c
$ mkdir -p com/example
자바 JNI 자바에서 C 라이브러리로 동적 할당 4byte 변수 활용 예제
아래는 JNI를 활용하여 자바에서 C 라이브러리로 동적으로 4바이트 변수를 생성하고 활용하는 예제입니다. 리소스를 자율적으로 사용할 수 있는 장점을 자바에서 사용할 수 있습니다.
package com.example;
public class JNIDemo {
static {
System.loadLibrary("pointer");
}
public native long mallocInt();
public native void setValue(long ptr, int value);
public native int getValue(long ptr);
public native void freeInt(long ptr);
public static void main(String[] args) {
JNIDemo demo = new JNIDemo();
long ptr = demo.mallocInt();
demo.setValue(ptr, 42);
int value = demo.getValue(ptr);
System.out.println("Value from C: " + value);
demo.freeInt(ptr);
}
}