프로그래밍/Android

JNI/자바 배열을 C배열로 변환하는 방법

우진샘 2013. 6. 12. 18:38

JNI/자바 배열을 C배열로 변환하는 방법


* 변환함수

반환값 

 함수원형

 jboolean*

 (*GetBooleanArrayElements)(JNIEnv*, jbooleanArray, jboolean*)

 jbyte*

 (*GetByteArrayElements)(JNIEnv*, jbyteArray, jboolean*)

 jchar*

 (*GetCharArrayElements)(JNIEnv*, jcharArray, jboolean*)

 jshort*

 (*GetShortArrayElements)(JNIEnv*, jshortArray, jboolean*)

 jint*

 (*GetIntArrayElements)(JNIEnv*, jintArray, jboolean*)

 jlong*

 (*GetLongArrayElements)(JNIEnv*, jlongArray, jboolean*)

 jfloat*

 (*GetFloatArrayElements)(JNIEnv*, jfloatArray, jboolean*)

 jdouble*

 (*GetDoubleArrayElements)(JNIEnv*, jdoubleArray, jboolean*)

마지막 인자 jboolean*은 보통 NULL을 넣어 준다.


* 해제함수

 반환값

 함수원형

 void

 (*ReleaseBooleanArrayElements)(JNIEnv*, jbooleanArray, jboolean*, jint)

 void

 (*ReleaseByteArrayElements)(JNIEnv*, jbyteArray, jbyte*, jint)

 void

 (*ReleaseCharArrayElements)(JNIEnv*, jcharArray, jchar*, jint)

 void

 (*ReleaseShortArrayElements)(JNIEnv*, jshortArray, jshort*, jint)

 void

 (*ReleaseIntArrayElements)(JNIEnv*, jintArray, jint*, jint)

 void

 (*ReleaseLongArrayElements)(JNIEnv*, jlongArray, jlong*, jint)

 void

 (*ReleaseFloatArrayElements)(JNIEnv*, jfloatArray, jfloat*, jint)

 void

 (*ReleaseDoubleArrayElements)(JNIEnv*, jdoubleArray, jdouble*, jint)

마지막 인자에 들어갈 수 있는 값

 mode

 actions

 0

 copy back the content and free the elems buffer
 변경된 데이터를 자바쪽 배열로 복사하고 C에 할당 된 버퍼는 해제를 한다.

 JNI_COMMIT

 copy back the content but do not free the elems buffer
 변경된 데이터를 자바쪽 배열로 복사하고 C에 할당 된 버퍼는 그대로 놔둔다.

 JNI_ABORT

 free the buffer without copying back the possible changes
 자바쪽에 복사하지 않고 그냥 C에 할당 된 버퍼만 해제를 한다.


* 데이터가 String일 경우

 반환값

 함수원형

 const char*

 (*GetStringUTFChars)(JNIEnv*, jstring, jboolean*)

 void

 (*ReleaseStringUTFChars)(JNIEnv*, jstring, const char*)


* 사용예제

JNIEXPORT void Java_com_example_mytest_test_arrayByte(JNIEnv *env, jobject obj, jbyteArray data)
{
    jchar
* pChar = (*env)->GetByteArrayElements(env, data, 0);
    .
    .
    .
    (*env)->
ReleaseByteArrayElements(env, data, pChar, 0);
}

JNIEXPORT void Java_com_example_mytest_test_arrayInt(JNIEnv *env, jobject obj, jintArray data)
{
    jint
* pInt = (*env)->GetIntArrayElements(env, data, NULL);
    .
    .
    .
    
(*env)->ReleaseIntArrayElements(env, data, pInt, 0);
}

JNIEXPORT void Java_com_example_mytest_test_jString(JNIEnv *env, jobject obj, jstring data)
{
    char strbuf[128];
    const char *sz = (*env)->GetSTringUTFChar(env, data, 0);
    strcpy(strbuf, sz);
    printf("string = %s\n", strbuf);
    (*env)->ReleaseStringUTFChars(env, data, sz);
}