Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/195.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2012/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android ndk内存不足问题_Android_Java Native Interface_Android Ndk_Out Of Memory - Fatal编程技术网

Android ndk内存不足问题

Android ndk内存不足问题,android,java-native-interface,android-ndk,out-of-memory,Android,Java Native Interface,Android Ndk,Out Of Memory,我正在尝试使用jni在android中进行实时图像处理。我有一个本地的方法来解码图像数据,我为每一帧调用这个方法。几秒钟后,我的内存用完,我的应用程序终止 日志输出: 12-03 20:54:19.780: E/dalvikvm-heap(8119): Out of memory on a 3686416-byte allocation. 我的本地方法: JNIEXPORT jintArray JNICALL Java_net_oyunyazar_arcc_data_FrameManager

我正在尝试使用jni在android中进行实时图像处理。我有一个本地的方法来解码图像数据,我为每一帧调用这个方法。几秒钟后,我的内存用完,我的应用程序终止

日志输出:

12-03 20:54:19.780: E/dalvikvm-heap(8119): Out of memory on a 3686416-byte allocation.
我的本地方法:

JNIEXPORT jintArray JNICALL  Java_net_oyunyazar_arcc_data_FrameManager_processImage(JNIEnv* env, jobject javaThis, jint width, jint height, jbyteArray arr) {

    jint *convertedData;
    convertedData = (jint*)malloc((width*height) * sizeof(jint));

    jintArray result = (*env)->NewIntArray(env, width*height);


    jint y,x;
    jbyte grey;

    jsize len = (*env)->GetArrayLength(env, arr);
    jbyte *YUVData = (*env)->GetByteArrayElements(env, arr, 0);

        for (y = 0; y < height; y++){
            for (x = 0; x < width; x++){

                grey = YUVData[y * width + x];
                convertedData[y*width+x] =(jint) grey & 0xff;

            }
        }

    LOGD("Random [%d]",len);

    (*env)->SetIntArrayRegion(env, result, 0, (width*height),convertedData );

    free(convertedData);
    (*env)->ReleaseByteArrayElements(env, YUVData, (jbyte*)arr, 0);

    return result;
}

谢谢你的帮助。

我和你有同样的问题

在您的特定情况下,当您使用像素和位图时,您可以发送位图而不是bytearray并对其进行修改

void *pixel_bm;
int retValue;

AndroidBitmapInfo info;
if ((retValue = AndroidBitmap_getInfo(env, bitmap, &info)) < 0) return 0;
if ((retValue = AndroidBitmap_lockPixels(env, bitmap, &pixel_bm)) < 0) return 0;

// you can now read an write into pixel_bm

AndroidBitmap_unlockPixels(env, bitmap);

如果你找到一个正确释放GetByteArrayElement结果的解决方案,我对这个解决方案不感兴趣

我通过释放参数解决了这个问题

(*env)->ReleaseByteArrayElements(env, arr, YUVData, 0);
现在效果很好