在jni-Android中删除变量引用

时间:2012-01-20 10:22:17

标签: android memory-management java-native-interface

我开发了一个简单的动态壁纸应用程序。在那里,我使用了两个名为captureWallpaper和DrawWallpaper的本机函数。其中Capture壁纸功能如下所示

void Java_com_sample_NativeCalls_ captureWallpaper(JNIEnv * env, jobject this){
struct SwsContext *img_convert_ctx;
 while(av_read_frame(pFormatCtx, &packet)>=0) { 
    if(packet.stream_index==videoStream) {      avcodec_decode_video(pCodecCtx, 
               pFrame, 
               &frameFinished, 
               packet.data, 
               packet.size);
      if(frameFinished) {        

    if(img_convert_ctx == NULL) {
        w = pCodecCtx->width;
        h = pCodecCtx->height;
        __android_log_print(ANDROID_LOG_DEBUG,  
                                        "video.c",  
                                        "NDK: Cannot initialize the conversion context!" 
                                    ); 
      img_convert_ctx =
         sws_getContext(
               w, h, 
               pCodecCtx->pix_fmt,
               textureWidth,textureHeight,textureFormat, 
               SWS_FAST_BILINEAR,
               NULL, NULL, NULL
               );           
      if(img_convert_ctx == NULL) {
        return;
      }

    }         

          sws_scale(img_convert_ctx,
          pFrame->data,
          pFrame->linesize, 
          0, pCodecCtx->height,
          pFrameConverted->data, 
          pFrameConverted->linesize);   

    av_free_packet(&packet);
    return;
      } 
    } 

        av_free_packet(&packet);     
  } 

  av_seek_frame(pFormatCtx,videoStream,0,AVSEEK_FLAG_ANY);
}

之后我在onDraw函数的java代码中使用了这些函数。当我一次又一次地调用这个方法时,我的ram内存会不断增加。我认为任何一个对象的引用都是创建的而不是被销毁的。任何人都知道这一点,请帮助我从这里出来。

1 个答案:

答案 0 :(得分:0)

您的问题可能很简单:

  if(img_convert_ctx == NULL) {
    return;
  }

,不返回av_free_packet

但是,从代码中你可以看出它无法给出答案,因为它没有显示有关不同变量,指针或函数的任何信息。