NDK(jni) JAVA与C互传数组对象

November 2012 · 1 minute read

最近在搞NDK底层一些功能的开发,被一个问题折腾了3天,起初一直以为是C这边的位运算出了问题,查到最后才发现是数组传递出了问题,一开始我是这样写的:

void Java_com_xxx_test1(JNIEnv* env, jobject thiz, jint* javaArray, jint array_size) {

other_function((int *)javaArray, (int)array_size);

} > >

真正正确的写法应该是这样:

void Java_com_xxx_test1(JNIEnv* env, jobject thiz, jintArray* javaArray) {

// For C

jint* pJint = (*env)->GetByteArrayElements(env, javaArray, 0);

jsize array_size = (*env)->GetArrayLength(env, javaArray);

// For C++

// jint* pJint = env->GetByteArrayElements(javaArray, 0);

// jsize array_size = env->GetArrayLength(javaArray);

other_function((int *)pJint, array_size);

} > >

理论上讲这个问题应该是很容易发现的,但我为什么纠结了这么久呢,因为在之前我的另一段类似的代码中是工作正常的,像这样:

void Java_com_xxx_test2(JNIEnv* env, jobject thiz, jint* javaArray, jint array_size) {

int a[10]; // 假设 array_size 一定会小于10

int i;

for (int = 0; i < array_size; i++)

{

a[i] = (int)javaArray[i];

}

} > >

所以我一直认为第一种写法是正确的,害死人啊。

C回传数组给JAVA是这样做的:

jintArray Java_com_xxx_test3(JNIEnv* env, jobject thiz) {

int a = {1, 2, 3, 4};

jbyteArray result;

result = (*env)->NewByteArray(env, 4);

(*env)->SetIntArrayRegion(env, result, 0, 4, a);

// For C++

// result = env->NewByteArray(4);

// env->setIntArrayRegion(result, 0, 4, a);

return result

} > >