本文实例为借鉴 http://www.ixueyi.com/jingyan/1865079.html 该文档后所写。主要是android的gralloc操作显存的模块实例,如有不正确的地方欢迎指出谢谢。

  Android帧缓冲区硬件抽象层模块Gralloc的实现原理。

   1. 分配一个匹配屏幕大小的图形缓冲区

2. 将分配好的图形缓冲区注册(映射)到当前进程的地址空间来

3. 将要绘制的画面的内容写入到已经注册好的图形缓冲区中去,并且渲染(拷贝)到系统帧缓冲区中去

为了实现以上三个操作,我们还需要:

1. 加载Gralloc模块

2. 打开Gralloc模块中的gralloc设备和fb设备

其中,gralloc设备负责分配图形缓冲区,Gralloc模块负责注册图形缓冲区,而fb设备负责渲染图形缓冲区。

  直接看源码:

  

 framebuffer_device_t* fbDev;
alloc_device_t* grDev; hw_module_t const* module;
buffer_handle_t handle;
gralloc_module_t const *mAllocMod;
void* vaddr;
int stride;
int err;
if (hw_get_module(GRALLOC_HARDWARE_MODULE_ID, &module) == ) {//加载gralloc模块 err = framebuffer_open(module, &fbDev); //打开fb设备
if(err) LOGE("couldn't open framebuffer HAL (%s)", strerror(-err));
err = gralloc_open(module, &grDev); //打开gralloc设备
if(err) LOGE("couldn't open gralloc HAL (%s)", strerror(-err)); err = grDev->alloc(grDev, display.w, display.h, HAL_PIXEL_FORMAT_RGBA_8888, GRALLOC_USAGE_HW_FB/*决定申请的是系统图形内存还是普通内存*/, &handle, &stride); //分配图形缓冲区
// err = grDev->alloc(grDev, 1024, 600, HAL_PIXEL_FORMAT_RGBA_8888, 0/*决定申请的是系统图形内存还是普通内存*/, &handle, &stride); //分配图形缓冲区 mAllocMod = (gralloc_module_t const *)module;
err = mAllocMod->registerBuffer(mAllocMod, handle); //映射内存到进程中 err = mAllocMod->lock(mAllocMod, handle, HAL_PIXEL_FORMAT_RGBA_8888, , , display.w, display.h, &vaddr);
LOGE("++++++++++++++++> vaddr = %p\n", vaddr); err = mAllocMod->lock(mAllocMod, handle, HAL_PIXEL_FORMAT_RGBA_8888, , , , , &vaddr);
LOGE("++++++++++++++++> vaddr = %p\n", vaddr);

//这就绘图即可,将绘制的图的内存直接拷贝到vaddr里面即可
bitmap.lockPixels();
  canvas->drawPath(path, paint);
  memcpy(vaddr, bitmap.getPixels(), bitmap.getSize());
  bitmap.unlockPixels();
err = mAllocMod->unlock(mAllocMod, handle); err = fbDev->post(fbDev, handle); //图形缓冲区的渲染 err = mAllocMod->unregisterBuffer(mAllocMod, handle); //解除映射内存 grDev->free(grDev, handle);//释放图形缓冲区 gralloc_close(grDev);//关闭gralloc设备
framebuffer_close(fbDev);//关闭fb设备
} 这样就可以直接绘图显示在屏幕上了,比直接操作/dev/graphics/fb0 设备文件要稳定很多。

Android gralloc 模块实例的更多相关文章

  1. Android HAL模块实现

    1. HAL介绍 Android的HAL(Hardware Abstract Layer硬件抽象层)是为了保护一些硬件提供商的知识产权而提出的.是为了避开linux的GPL束缚. 思路是把控制硬件的动 ...

  2. Android照相机模块编程 照片颠倒问题及查询摄像头参数问题的解决

    这两天编程弄Android照相机模块,设置好各种参数后,发现预览的时候,照片是颠倒了,不是上下颠倒而是颠倒90°. 我的手机是华为U9200,用的Android4.0.3,后来看到http://www ...

  3. android widget 开发实例 : 桌面便签程序的实现具体解释和源代码 (上)

    如有错漏请不吝拍砖指正,转载请注明出处,很感谢 桌面便签软件是android上经常使用软件的一种,比方比較早的Sticky Note,就曾很流行, Sticky Note的介绍能够參见 http:// ...

  4. Android 下载模块分析(DownloadManager和DownloadProvider)

    Android下载模块主要有2个部分组成:DownloadManager和DownloadProvider:其中DownloadManager提供接口供调用,具体的实现是 DownloadProvid ...

  5. Android进阶(二十三)Android开发过程之实例讲解

    Android开发过程之实例讲解 前言 回过头来审视之前做过的Android项目,发觉自己重新开发时忽然间不知所措了,间隔了太长时间没有开发导致自己的Android技能知识急剧下降.温故而知新. 废话 ...

  6. React Native Android原生模块开发实战|教程|心得|怎样创建React Native Android原生模块

    尊重版权,未经授权不得转载 本文出自:贾鹏辉的技术博客(http://blog.csdn.net/fengyuzhengfan/article/details/54691503) 告诉大家一个好消息. ...

  7. [转]Android:布局实例之模仿QQ登录界面

    Android:布局实例之模仿QQ登录界面 预览图: 准备: 1.找到模仿对象 QQ登陆界面UI下载>>>>> 2.导入工程 3.查看布局结构和使用控件 其对应效果图分布 ...

  8. Android 应用开发实例之情景模式

    2013-07-01 Android 应用开发实例 1. 情景模式 使用TabHost来实现主界面的布局. 设置一组RadioButton来切换不同的情景模式. 对比普通情景模式,定时情景模式需要加上 ...

  9. android 编译模块

    android 编译模块 在写完.c文件之后,需要加载到android上进行测试.使用arm-linux-gcc编译,并添加到android开发板上运行失败. 由于android与linux不同,需要 ...

随机推荐

  1. HALCON之喷码OCR识别案例

    一个喷码识别的案例 1 read_image (Image, 'D:/用户目录/Desktop/2.png') 2 3 rgb1_to_gray(Image, Image) 4 5 get_image ...

  2. LNMP架构下的nginx、mysql、php的源码安装

    一.LNMP的介绍 LNMP就是Linux+Nginx+Mysql+Php这种网站服务架构.Linux是一类Unix计算机操作系统的统称,是目前最流行的免费操作系统,常见版本有:centos.ubun ...

  3. adb命令安装apk

    1.将需要安装的apk放在platform-tools下 2.将手机和电脑连接,在cmd中输入 adb devices查看 3.使用adb命令安装apk,在cmd中输入:adb install apk ...

  4. 使用POI导出Excel(二)-利用模板

    一.基本操作见: 使用POI导出Excel 二.本次功能需求 给了一个模板,里面有6个sheet页,每页里面都需要填充相应的数据.如图: 三.需求分析 1.分了6个sheet页,每页的数据都不一样,首 ...

  5. CF1082G:G. Petya and Graph(裸的最大闭合权图)

    Petya has a simple graph (that is, a graph without loops or multiple edges) consisting of n n vertic ...

  6. LightOJ - 1396 :Palindromic Numbers (III)(逐位确定法)

    Vinci is a little boy and is very creative. One day his teacher asked him to write all the Palindrom ...

  7. 《DSP using MATLAB》Problem 2.9

    代码: %% ------------------------------------------------------------------------ %% Output Info about ...

  8. [CLPR]BP神经网络的C++实现

    文章翻译自: http://www.codeproject.com/Articles/16650/Neural-Network-for-Recognition-of-Handwritten-Digi ...

  9. [LeetCode系列] K节点倒序问题迭代解法

    给定链表和整数k, 使用in-space方法将链表按k个为一组进行倒序, 如果剩余个数不足k个则保留其原始顺序. 如给定1->2->3->4->5, k = 2, 需要返回 2 ...

  10. websocket之四:WebSocket 的鉴权授权方案

    引子 WebSocket 是个好东西,为我们提供了便捷且实时的通讯能力.然而,对于 WebSocket 客户端的鉴权,协议的 RFC 是这么说的: This protocol doesn’t pres ...