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

发布于 2024-10-18 20:19:51 字数 723 浏览 2 评论 0原文

我在 android 中流式传输视频,并用本机代码解码帧,然后将像素复制到位图,然后使用 canvas.unlockandpost 在 Java 中显示位图,并对所有位图进行 while 循环。

一切都很好,但位图流非常慢并导致崩溃。我只在 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);

I am streaming a video in android and I decode frames in native code and then copy the pixels to a bitmap, then display the bitmap in Java using canvas.unlockandpost with a while loop for all the bitmaps.

Everything is fine, but the streaming of bitmaps is very slow and causes a crash. I only see a message on logcat saying that "low memory no more background processes".

I see on the allocation table from eclipse, that the bitmaps that I created are not getting deleted from memory, even though, I am overwritng the pixels everytime. Is there any way I can clean up the memory it is keeping.

My code is as follows.

C Code :

AndroidBitmapInfo  info;
void*              pixels;
int                ret;


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

memcpy(pixels, pictureRGB, 480*320);

AndroidBitmap_unlockPixels(env, bitmap);

Java Code

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

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

香草可樂 2024-10-25 20:19:51

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

The code shown in your question is missing some critical parts to fully understand your problem, but it sounds like you're creating a new bitmap for every frame. Since Android only allows for about 16MB of allocations for each Java VM, your app will get killed after about 52 frames. You can create a bitmap once and re-use it many times. To be more precise, you are creating a bitmap (Bitmap.CreateBitmap), but not destroying it (Bitmap.recycle). That would solve your memory leak, but still would not be the best way to handle it. Since the bitmap size doesn't change, create it once when your activity starts and re-use it throughout the life of your activity.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文