我有这段代码是从 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;”但无济于事。
什么占用了所有这些内存,我该如何释放它?
最佳答案
您还需要 ReleaseByteArrayElements:(而不是删除)
http://docs.oracle.com/javase/1.5.0/docs/guide/jni/spec/functions.html
GetArrayElements Routines
NativeType *GetArrayElements(JNIEnv *env, ArrayType array, jboolean *isCopy);
A family of functions that returns the body of the primitive array. The result is valid until the corresponding ReleaseArrayElements() function is called. Since the returned array may be a copy of the Java array, changes made to the returned array will not necessarily be reflected in the original array until ReleaseArrayElements() is called.
请看加粗部分。
关于android - Android JNI 中的 OOM 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23180788/