关闭活动后FFmpeg泄漏内存

时间:2015-07-28 12:17:54

标签: android ffmpeg java-native-interface

我试图基于roman10 tutorial实现rtsp播放器。 我可以播放一个流,但每次我离开活动时都会泄漏很多内存 经过一些研究后,似乎是全局作业的位图是原因:

jobject createBitmap(JNIEnv *pEnv, int pWidth, int pHeight) {
    int i;
    //get Bitmap class and createBitmap method ID
    jclass javaBitmapClass = (jclass)(*pEnv)->FindClass(pEnv, "android/graphics/Bitmap");
    jmethodID mid = (*pEnv)->GetStaticMethodID(pEnv, javaBitmapClass, "createBitmap", "(IILandroid/graphics/Bitmap$Config;)Landroid/graphics/Bitmap;");
    //create Bitmap.Config
    //reference: https://forums.oracle.com/thread/1548728
    const wchar_t* configName = L"ARGB_8888";
    int len = wcslen(configName);
    jstring jConfigName;
    if (sizeof(wchar_t) != sizeof(jchar)) {
        //wchar_t is defined as different length than jchar(2 bytes)
        jchar* str = (jchar*)malloc((len+1)*sizeof(jchar));
        for (i = 0; i < len; ++i) {
            str[i] = (jchar)configName[i];
        }
        str[len] = 0;
        jConfigName = (*pEnv)->NewString(pEnv, (const jchar*)str, len);
    } else {
        //wchar_t is defined same length as jchar(2 bytes)
        jConfigName = (*pEnv)->NewString(pEnv, (const jchar*)configName, len);
    }
    jclass bitmapConfigClass = (*pEnv)->FindClass(pEnv, "android/graphics/Bitmap$Config");
    jobject javaBitmapConfig = (*pEnv)->CallStaticObjectMethod(pEnv, bitmapConfigClass,
            (*pEnv)->GetStaticMethodID(pEnv, bitmapConfigClass, "valueOf", "(Ljava/lang/String;)Landroid/graphics/Bitmap$Config;"), jConfigName);
    //create the bitmap
    return (*pEnv)->CallStaticObjectMethod(pEnv, javaBitmapClass, mid, pWidth, pHeight, javaBitmapConfig);
}

位图的创建方式如下:

bitmap = createBitmap(...);

当活动关闭时,会调用此方法:

void finish(JNIEnv *pEnv) {
    //unlock the bitmap
    AndroidBitmap_unlockPixels(pEnv, bitmap);
    av_free(buffer);
    // Free the RGB image
    av_free(frameRGBA);
    // Free the YUV frame
    av_free(decodedFrame);
    // Close the codec
    avcodec_close(codecCtx);
    // Close the video file
    avformat_close_input(&formatCtx);
}

位图似乎永远不会被释放,只是解锁。

我该怎么做才能确保回忆所有的记忆?

注意:我使用的是ffmpeg 2.5.2。

0 个答案:

没有答案
相关问题