Skip to content

JNI:DataByPass

JAVA와 JNI의 데이터 전달 방법에 대한 설명.

자바 배열 타입(Java array type)전달방법

JAVA에서 배열타입 데이터를 JNI에서 획득하는 방법에 대하여 설명한다. JAVA측 JNI호출 Method Prototype은 아래와 같다.

private static native void generateTexture(int [] pixels);

JNI측 Method 구현은 아래와 같다.

JNIEXPORT void JNICALL
Java_com_example_MapView_generateTexture(JNIEnv* env, jobject thiz, jintArray pixels)
{
    int * acquire_pixels = env->GetIntArrayElements(pixels, 0);
    if (acquire_pixels != 0) {
        // use acquire_pixels.
    }
    env->ReleaseIntArrayElements(pixels, acquire_pixels, JNI_ABORT);
}

자바 String 전달방법

JAVA에서 String 타입을 JNI에 전달하거나 전달받는 방법에 대하여 설명한다. JAVA측 JNI호출 Method Prototype은 아래와 같다.

public native String greeting(String name);

JNI측 Method 구현은 아래와 같다. 문자열을 입력받은 후 다시 반환한다.

JNIEXPORT jstring JNICALL
Java_JNITest_greeting(JNIEnv *env, jobject obj, jstring jstr) {
    const char *name = (*env)->GetStringUTFChars(env, jstr, NULL);//Java String to C Style string
    char msg[60] = "Hello ";
    jstring result;
    strcat(msg, name);
    (*env)->ReleaseStringUTFChars(env, jstr, name);
    puts(msg);
    result = (*env)->NewStringUTF(env, msg); // C style string to Java String
    return result;
}

자바 String 전달방법 02

JAVA에서 String 타입을 JNI에 전달하는 더욱 간단한 샘플은 아래와 같다.

JNIEXPORT void JNICALL
Java_com_example_MapView_generateTexture(JNIEnv* env, jobject thiz, jstring key)
{
    std::string key_string;
    const char * acquire_key = env->GetStringUTFChars(key, NULL);  //Java String to C Style string
    key_string.assign(acquire_key);
    env->ReleaseStringUTFChars(key, acquire_key);
}

See also