Android JNI中的OOM错误

时间:2014-04-20 09:55:51

标签: android c++ java-native-interface

我有这个从onPreviewFrame()调用的代码(实际上,包装器函数调用此代码,但除了调用它之外什么都不做),它应该在预览帧上执行一些OpenCV操作。问题是它在几个周期后不断抛出OOM错误,因此我将代码剥离到最小但仍会引发此错误。

int ContrastMeasure(JNIEnv* env, jobject obj, jbyteArray yuv, jint pw, jint ph)
{
    if (isContrastBusy)
    {
        return 0;
    }
    isContrastBusy = true;
    jbyte* _yuv = env->GetByteArrayElements(yuv, 0);
    delete [] _yuv;
    isContrastBusy = false;
    return 0;
}

自从我使用c ++以来已经很久了,所以我知道我的错误可能真的很愚蠢。 我尝试了env->DeleteLocalRef(obj);,并且还删除了_yuv;'但无济于事。

什么是记忆,以及如何释放它?

1 个答案:

答案 0 :(得分:2)

您还需要ReleaseByteArrayElements :(而不是删除)

http://docs.oracle.com/javase/1.5.0/docs/guide/jni/spec/functions.html

  

GetArrayElements例程

     

NativeType * GetArrayElements(JNIEnv * env,ArrayType   array,jboolean * isCopy);

     

返回基本数组主体的一系列函数。   结果有效直到相应   调用ReleaseArrayElements()函数。自从   返回的数组可能是Java数组的副本,所做的更改   返回的数组不一定会反映在原始数组中   直到调用ReleaseArrayElements()。

见粗体部分。