Удалить переменную refrence в jni-Android - PullRequest
0 голосов
/ 20 января 2012

Я разработал простое приложение для живых обоев. В этом я использовал две встроенные функции с именем 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);
}

После этого я использую эти функции в своем Java-коде в функции onDraw. Когда я снова и снова вызываю этот метод, моя оперативная память продолжает увеличиваться. Я думаю, что ссылка какого-либо одного объекта была создана, а не уничтожена. Любой, кто знает об этом, пожалуйста, помогите мне выйти из этого.

1 Ответ

0 голосов
/ 20 января 2012

Ваша проблема может быть простой:

  if(img_convert_ctx == NULL) {
    return;
  }

, который возвращается без av_free_packet.

Однако из кода, который вы показываете, на самом деле невозможно дать ответ, так как он ничего не показывает о различных переменных, указателях или функциях.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...