목차
- 자바 javac 활용 자바 소스 코드 컴파일 예제 이전 포스팅 참고 학습
- 자바 JNI C 메모리 동적 할당한 변수 활용 예제 이전 포스팅 참고 학습
- 자바 AES 256 CBC 암복호화 예제 이전 포스팅 참고 학습
- 자바 JNI C 문자열 변수 포인터 생성, 삭제, 값 저장, 읽기 함수 구현 예제(저장 문자열 길이에 따라 realloc)
- 자바 JNI 자바에서 C 포인터 활용 문자열 값 저장 가져오기 예제
자바 javac 활용 자바 소스 코드 컴파일 예제 이전 포스팅 참고 학습
자바 개발에서 소스 코드를 실행 가능한 바이트 코드로 컴파일하는 과정입니다. javac 명령어를 사용하여 자바 소스 파일을 컴파일하고, .class 파일을 생성합니다. 그리고 이러한 class 파일은 java 명령어로 실행이 가능합니다. 따라서 자바 포스팅에 나오는 예제들을 직접 실행해보기 위해서는 이러한 javac 명령을 활용할 줄 알아야합니다. 이러한 컴파일 과정에 대한 예제를 이전 포스팅에서 알아보았습니다. 리눅스 환경에서 자바 소스 코드를 javac로 컴파일하는 방법이 궁금하시다면 아래 링크를 참고해주세요.
2023.08.10 - [Linux] - [Linux/Java] 리눅스 우분투에서 java 컴파일 및 실행 예제(javac)
자바 JNI C 메모리 동적 할당한 변수 활용 예제 이전 포스팅 참고 학습
JNI를 사용하면 자바와 C 또는 C++ 코드 간의 통합이 가능합니다. 이를 활용하여 C 코드에서 동적으로 메모리를 할당하고 자바로 데이터를 전달하는 것이 가능합니다. 이전 포스팅에서는 JNI를 활용하여 C 코드에서 4byte int형 변수 포인터를 생성하여 자바에 반환하게하고 이 주소를 가지고 자바와 C간 통신을 통해 값 저장, 읽기 등이 가능한 함수를 구현하였습니다. 자바에서 C 포인터를 사용하는 방법이 궁금하시다면 아래 링크를 참고해주세요.
2023.09.19 - [Java] - [Java/C] 자바 JNI malloc, free 활용 메모리 동적 할당 변수 생성,삭제,값 저장 예제(포인터)
자바 AES 256 CBC 암복호화 예제 이전 포스팅 참고 학습
이전 포스팅에서는 자바에서 AES 256 CBC 암호화를 사용하여 데이터를 안전하게 암호화하고 복호화하는 방법과 예제에 대해 알아보았습니다. 사용자 비밀번호나 개인정보와 같은 중요 정보들은 사용자만 알고있는 키로 암호화하여 다른 사람은 알 수 없도록 만들어야합니다. AES 256 암호화는 키가 32바이트이고 IV 16바이트를 사용하는 암호화 알고리즘입니다. 자바에서 이러한 AES 256 암복호화 방법이 궁금하시다면 아래 링크를 참고해주세요.
2023.08.17 - [Java] - [Java/Linux] 자바 AES 256 CBC 모드 암복호화에 IV 사용 예제
자바 JNI C 문자열 변수 포인터 생성, 삭제, 값 저장, 읽기 함수 구현 예제(저장 문자열 길이에 따라 realloc)
아래는 JNI를 활용하여 C 코드에서 문자열 변수를 동적으로 할당하고, 문자열 길이에 따라 메모리를 재할당하는 예제입니다. 자바에서는 C에서 만든 포인터 주소를 가지고 C와 통신하여 값을 저장하고 읽을 수 있습니다.
// jnistring.c
#include <jni.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
JNIEXPORT jlong JNICALL Java_com_example_NativeLibrary_createBuffer(JNIEnv *env, jobject obj, jlong bufferSize) {
char *buffer = (char *)malloc(bufferSize);
if (buffer == NULL) {
jclass exceptionClass = (*env)->FindClass(env, "java/lang/OutOfMemoryError");
(*env)->ThrowNew(env, exceptionClass, "Failed to allocate memory");
return 0;
}
return (jlong)buffer;
}
JNIEXPORT void JNICALL Java_com_example_NativeLibrary_storeString(JNIEnv *env, jobject obj, jlong bufferPtr, jstring javaString) {
const char *nativeString = (*env)->GetStringUTFChars(env, javaString, NULL);
if (nativeString == NULL) {
return;
}
char *buffer = (char *)bufferPtr;
size_t newSize = strlen(nativeString) + 1;
if (newSize > strlen(buffer)) {
buffer = (char *)realloc(buffer, newSize);
if (buffer == NULL) {
jclass exceptionClass = (*env)->FindClass(env, "java/lang/OutOfMemoryError");
(*env)->ThrowNew(env, exceptionClass, "Failed to reallocate memory");
return;
}
}
strcpy(buffer, nativeString);
(*env)->ReleaseStringUTFChars(env, javaString, nativeString);
}
JNIEXPORT jstring JNICALL Java_com_example_NativeLibrary_getString(JNIEnv *env, jobject obj, jlong bufferPtr) {
char *buffer = (char *)bufferPtr;
jstring javaString = (*env)->NewStringUTF(env, buffer);
return javaString;
}
JNIEXPORT void JNICALL Java_com_example_NativeLibrary_freeBuffer(JNIEnv *env, jobject obj, jlong bufferPtr) {
char *buffer = (char *)bufferPtr;
free(buffer);
}
자바 JNI 자바에서 C 포인터 활용 문자열 값 저장 가져오기 예제
아래는 자바에서 JNI를 사용하여 C 포인터를 활용하여 문자열 값을 저장하고 가져오는 예제입니다. JNI를 통해 자바와 C 간의 데이터 교환을 수행하는 방법을 설명합니다.
package com.example;
public class NativeLibrary {
static {
System.loadLibrary("jnistring");
}
private static native long createBuffer(long bufferSize);
private static native void storeString(long bufferPtr, String str);
private static native String getString(long bufferPtr);
private static native void freeBuffer(long bufferPtr);
public static void main(String[] args) {
long bufferPtr = createBuffer(256);
String inputString = "Hello, JNI!";
storeString(bufferPtr, inputString);
String outputString = getString(bufferPtr);
System.out.println("Received from native code: " + outputString);
freeBuffer(bufferPtr);
}
}