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

最近在搞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
}

发表评论

电子邮件地址不会被公开。 必填项已用*标注