android - 为什么使用 Android NDK 通过 JNI 将 native 数组复制回 Java 无法正确填充?

标签 android arrays android-ndk java-native-interface integer

这里是全局初始化器:

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/

相关文章:

android - 在android中逐步实现注册过程的方法

javascript - 迭代 Javascript 数组

c++ - 具有无效函数类型或数组类型参数的 SFINAE?

android - 如何将现有的 .so 库添加到 Android Studio 项目中?

java - 奇怪的 java.lang.UnsatisfiedLinkError : Native method not found:

android - 带有 STLport_shared 的 NDK 用于独立二进制文件?

java - 即使在升级 gradle 插件后,gradle 项目同步也失败

android - 使用javascript登录facebook后android webview中的空白页面

android - AppCompat v7 :21 Split Action Bar Broken?

javascript - jqPlot 的 JSON