Android ffmpeg发布:传递给dlfree的无效地址或损坏块的地址

时间:2014-12-11 12:22:08

标签: android ffmpeg java-native-interface

伙计们。我是Android JNI开发以及ffmpeg libs的新手。

经过一些努力,我设法解码实时H264数据,但在释放ffmpeg解码器时遇到错误:

12-11 19:54:36.428  27959-27959/com.example.firmament.dji A/libc﹕ invalid address or address of corrupt block 0x6fa13868 passed to dlfree
12-11 19:54:36.430  27959-27959/com.example.firmament.dji A/libc﹕ Fatal signal 11 (SIGSEGV) at 0xdeadbaad (code=1), thread 27959 (e.firmament.dji)

stackoverflow中的一些问题提到这个错误与错误地释放了一些被保护的内存有关(与Segment Fault相同)。

我检查了C JNI代码的次数并且无法修复bug,这是我的代码(发布部分):

jint Java_com_example_firmament_dji_XKZH264_release(JNIEnv *env, jobject obj)
{
    if (pFrame != NULL) {
        av_free(pFrame);
        pFrame = NULL;
    }

    if (pCodecContext != NULL) {
        avcodec_close(pCodecContext);
        av_free(pCodecContext);
        pCodecContext = NULL;
    }

    if (pParserContext != NULL) {
        av_parser_close(pParserContext);
        av_free(pParserContext);
        pParserContext = NULL;
    }

    DeleteYUVTab();

    return 1;
}

void DeleteYUVTab()
{
    if (colortab != NULL) {
        av_free(colortab);
        colortab = NULL;
    }

    if (rgb_2_pix != NULL) {
        av_free(rgb_2_pix);
        colortab = NULL;
    }
}

1 个答案:

答案 0 :(得分:2)

哦,经过一番挣扎,我终于解决了这个问题。

av_parser_close(pParserContext);

这个语句好像已经有了免费的avCodecParserContext,所以另一个av_free会导致段错误。只需删除它并解决问题。