我有这个从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;'但无济于事。
答案 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()。
见粗体部分。