const char *className = "java/lang/String";
jclass stringClass = (*env)->FindClass(env, className);
jclass clazz = (*env)->GetObjectClass(env, obj);
jmethodID methodID = (*env)->GetMethodID(env, clazz, "someMethod", "()V");
(*env)->CallVoidMethod(env, obj, methodID);
Java와 C/C++ 간 데이터 변환이 필요함
Java | JNI |
int | jint |
boolean | jboolean |
String | jstring |
Object | jobject |
예제(java string -> c char*)
jstring jstr = (*env)->NewStringUTF(env, "Hello JNI");
const char *cstr = (*env)->GetStringUTFChars(env, jstr, NULL);
printf("%s\n", cstr);
(*env)->ReleaseStringUTFChars(env, jstr, cstr);
장점
단점
public class NativeExample {
static {
System.loadLibrary("nativeLib");
}
public native void sayHello();
public static void main(String[] args) {
new NativeExample().sayHello();
}
}
#include <jni.h>
#ifndef _Included_NativeExample
#define _Included_NativeExample
#ifdef __cplusplus
extern "C" {
#endif
JNIEXPORT void JNICALL Java_NativeExample_sayHello(JNIEnv *, jobject);
#ifdef __cplusplus
}
#endif
#endif
#include <jni.h>
#include <stdio.h>
#include "NativeExample.h"
// 네이티브 메서드 구현
JNIEXPORT void JNICALL Java_NativeExample_sayHello(JNIEnv *env, jobject obj) {
printf("Hello from C!\n");
}
네이티브 라이브러리 컴파일
Java 실행
https://velog.io/@cksgh1224/JNI-%EC%82%AC%EC%9A%A9%ED%95%98%EA%B8%B0
https://velog.io/@vrooming13/JNI-JAVA-Native-Interface
https://hbase.tistory.com/82
https://www.ibm.com/docs/ko/sdk-java-technology/8?topic=jni-overview
https://modelmaker.tistory.com/entry/JNI%EC%99%80-JNI%EC%97%90%EC%84%9C-java-%EC%BD%94%EB%93%9C%EC%97%90-%EC%A0%91%EA%B7%BC%ED%95%98%EB%8A%94-%EB%B0%A9%EB%B2%95%EB%93%A4-Java-Native-Interface