android - Android JNI 中的 OOM 错误

标签 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;”但无济于事。

什么占用了所有这些内存,我该如何释放它?

最佳答案

您还需要 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/

相关文章:

Android Studio 布局 - 在同一行上彼此相邻的两个 TextView 的父级中水平居中

java - 将插件和文件传输到新的 ADT 版本 23?

c++ - 用函数替换宏

python - 当在另一个应用程序中嵌入 python 时,如何导入或调用子模块中的函数(即 scipy.optimize.nnls)?

java - JNI 传递与实际给定的不同的函数参数值

java - 一旦我按下Escape键,jvm就会崩溃

Java 编译错误 :/bin/ld:cannot find -ljvm

java - 嵌套的警告对话框

java - 是否有内置方法、InputType 或其他聪明的方法来使 Android EditText 小部件拒绝接受逗号?

c++ - MVP 矩阵在着色器之外不工作?