我开发了一个简单的动态壁纸应用程序。在那里,我使用了两个名为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内存会不断增加。我认为任何一个对象的引用都是创建的而不是被销毁的。任何人都知道这一点,请帮助我从这里出来。
答案 0 :(得分:0)
您的问题可能很简单:
if(img_convert_ctx == NULL) {
return;
}
,不返回av_free_packet
。
但是,从代码中你可以看出它无法给出答案,因为它没有显示有关不同变量,指针或函数的任何信息。