android - 从本机代码渲染位图 - nativeCreate位图不是从内存中清除的

时间:2011-02-22 18:31:23

标签: android crash bitmap android-emulator android-ndk

我在Android中播放视频,我在本机代码中解码帧,然后将像素复制到位图,然后使用canvas.unlockandpost以及所有位图的while循环在Java中显示位图。

一切都很好,但位图的流式传输非常缓慢并导致崩溃。我只在logcat上看到一条消息,说“低内存不再有后台进程”。

我在eclipse的分配表上看到,我创建的位图没有从内存中删除,即使我每次都覆盖像素。有什么方法可以清理它所保留的记忆。

我的代码如下。

C代码:

AndroidBitmapInfo  info;
void*              pixels;
int                ret;


if ((ret =AndroidBitmap_lockPixels(env, bitmap, &pixels)) < 0) {
}

memcpy(pixels, pictureRGB, 480*320);

AndroidBitmap_unlockPixels(env, bitmap);

Java代码

     Bitmap mBitmap = Bitmap.createBitmap(480, 320, Bitmap.Config.RGB_565);
     renderbitmap(mBitmap, 0);
     canvas.drawBitmap(mBitmap, 0, 0, null);

1 个答案:

答案 0 :(得分:1)

您的问题中显示的代码缺少一些关键部分来完全理解您的问题,但听起来您正在为每个帧创建一个新的位图。由于Android仅为每个Java VM分配大约16MB的分配,因此您的应用程序将在大约52帧后被杀死。您可以创建一次位图并重复使用多次。更确切地说,您正在创建一个位图(Bitmap.CreateBitmap),但不会销毁它(Bitmap.recycle)。这将解决您的内存泄漏,但仍然不是处理它的最佳方式。由于位图大小不会更改,因此在您的活动开始时创建一次,并在活动的整个生命周期中重复使用它。