这里是全局初始化器:
int width = 100;
int height = 100;
int cells = width * height;
int* pixels = (int*) malloc(sizeof(int) * cells);
int i;
for (i = 0; i < cells; i++) {
pixels[i] = 255;
}
下面是通过 JNI 调用将数组复制回 Java 的代码:
void Java_com_example_app_setPixels(
JNIEnv *env, jobject obj, jintArray arr) {
// initializations, declarations, etc
jint *c_array;
jint i = 0;
// get a pointer to the array
c_array = (*env)->GetIntArrayElements(env, arr, NULL);
// do some exception checking
if (c_array == NULL) {
return; /* exception occurred */
}
for (i = 0; i < cells; i++) {
c_array[i] = (jint) pixels[i];
}
// release the memory so java can have it again
(*env)->ReleaseIntArrayElements(env, arr, c_array, 0);
}
这导致了一个大部分被填满的 Java 数组——但是它在大约 80% 的过程中停止了。
但是如果我改变:
c_array[i] = (jint) pixels[i];
到
c_array[i] = 255;
填充修改后的Java数组。
最佳答案
一如既往,这是我自己的错。分配的数组(像素)和复制到的数组大小不同。
修复数组大小后,一切正常。
关于android - 为什么使用 Android NDK 通过 JNI 将 native 数组复制回 Java 无法正确填充?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14437624/