Android帧缓冲区(Frame Buffer)硬件抽象层(HAL)模块Gralloc的实现原理分析(2)...

   函数load也是实现在文件hardware/libhardware/hardware.c文件中,如下所示:

  1. static int load(const char *id,  
  2.         const char *path,  
  3.         const struct hw_module_t **pHmi)  
  4. {  
  5.     int status;  
  6.     void *handle;  
  7.     struct hw_module_t *hmi;  
  8.   
  9.     /* 
  10.      * load the symbols resolving undefined symbols before 
  11.      * dlopen returns. Since RTLD_GLOBAL is not or'd in with 
  12.      * RTLD_NOW the external symbols will not be global 
  13.      */  
  14.     handle = dlopen(path, RTLD_NOW);  
  15.     if (handle == NULL) {  
  16.         char const *err_str = dlerror();  
  17.         LOGE("load: module=%s\n%s", path, err_str?err_str:"unknown");  
  18.         status = -EINVAL;  
  19.         goto done;  
  20.     }  
  21.   
  22.     /* Get the address of the struct hal_module_info. */  
  23.     const char *sym = HAL_MODULE_INFO_SYM_AS_STR;  
  24.     hmi = (struct hw_module_t *)dlsym(handle, sym);  
  25.     if (hmi == NULL) {  
  26.         LOGE("load: couldn't find symbol %s", sym);  
  27.         status = -EINVAL;  
  28.         goto done;  
  29.     }  
  30.   
  31.     /* Check that the id matches */  
  32.     if (strcmp(id, hmi->id) != 0) {  
  33.         LOGE("load: id=%s != hmi->id=%s", id, hmi->id);  
  34.         status = -EINVAL;  
  35.         goto done;  
  36.     }  
  37.   
  38.     hmi->dso = handle;  
  39.   
  40.     /* success */  
  41.     status = 0;  
  42.   
  43.     done:  
  44.     if (status != 0) {  
  45.         hmi = NULL;  
  46.         if (handle != NULL) {  
  47.             dlclose(handle);  
  48.             handle = NULL;  
  49.         }  
  50.     } else {  
  51.         LOGV("loaded HAL id=%s path=%s hmi=%p handle=%p",  
  52.                 id, path, *pHmi, handle);  
  53.     }  
  54.   
  55.     *pHmi = hmi;  
  56.   
  57.     return status;  
  58. }  
        在Linux系统中,后缀名为"so"的文件为动态链接库文件,可能通过函数dlopen来加载到内存中。硬件抽象层模块编写规范规定每一个硬件抽象层模块都必须导出一个符号名称为HAL_MODULE_INFO_SYM_AS_STR的符号,而且这个符号必须是用来描述一个类型为hw_module_t的结构体的。
        HAL_MODULE_INFO_SYM_AS_STR是一个宏,定义在文件hardware/libhardware/include/hardware/hardware.h文件中,如下所示:
  1. #define HAL_MODULE_INFO_SYM_AS_STR  "HMI"  

       将Gralloc模块加载到内存中来之后,就可以调用函数dlsym来获得它所导出的符号HMI。由于这个符号指向的是一个hw_module_t结构体,因此,最后函数load就可以强制地将这个符号转换为一个hw_module_t结构体指针,并且保存在输出参数pHmi中返回给调用者。调用者获得了这个hw_module_t结构体指针之后,就可以创建一个gralloc设备或者一个fb设备。

       模块Gralloc实现在目录hardware/libhardware/modules/gralloc中,它导出的符号HMI定义在文件hardware/libhardware/modules/gralloc/gralloc.cpp文件中,如下所示:

  1. static struct hw_module_methods_t gralloc_module_methods = {  
  2.         open: gralloc_device_open  
  3. };  
  4.   
  5. struct private_module_t HAL_MODULE_INFO_SYM = {  
  6.     base: {  
  7.         common: {  
  8.             tag: HARDWARE_MODULE_TAG,  
  9.             version_major: 1,  
  10.             version_minor: 0,  
  11.             id: GRALLOC_HARDWARE_MODULE_ID,  
  12.             name: "Graphics Memory Allocator Module",  
  13.             author: "The Android Open Source Project",  
  14.             methods: &gralloc_module_methods  
  15.         },  
  16.         registerBuffer: gralloc_register_buffer,  
  17.         unregisterBuffer: gralloc_unregister_buffer,  
  18.         lock: gralloc_lock,  
  19.         unlock: gralloc_unlock,  
  20.     },  
  21.     framebuffer: 0,  
  22.     flags: 0,  
  23.     numBuffers: 0,  
  24.     bufferMask: 0,  
  25.     lock: PTHREAD_MUTEX_INITIALIZER,  
  26.     currentBuffer: 0,  
  27. };  

       HAL_MODULE_INFO_SYM也是一个宏,它的值是与宏HAL_MODULE_INFO_SYM_AS_STR对应的,它也是定义在文件hardware/libhardware/include/hardware/hardware.h文件中,如下所示:
图1 private_module_t结构体定义

    结构体private_module_t的第一个成员变量base指向一个gralloc_module_t结构体,而gralloc_module_t结构体的第一个成员变量common又指向了一个hw_module_t结构体,这意味着,指向一个private_module_t结构体的指针同时可以用作一个gralloc_module_t或者hw_module_t结构体提针来使用。事实上,这是使用C语言来实现的一种继承关系,等价于结构体private_module_t继承结构体gralloc_module_t,而结构体gralloc_module_t继承hw_module_t结构体。这样,我们就可以把在Gralloc模块中定义的符号HAL_MODULE_INFO_SYM看作是一个hw_module_t结构体。

        hw_module_t结构体有一个重要的成员变量methods,它的类型为hw_module_methods_t,它用来描述一个HAL模块的操作方法列表。结构体hw_module_methods_t只定义有一个操作方法open,用来打开一个指定的设备。在Gralloc模块中,用来打开指定设备的函数被指定为gralloc_device_open,通过这个函数就可以打开Gralloc模块中的gralloc或者fb设备,后面我们再详细分析。





本文转自 Luoshengyang 51CTO博客,原文链接:http://blog.51cto.com/shyluo/967062,如需转载请自行联系原作者

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/286905.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

VS2019社区版(Community)试用30天过期的有效解决办法

VS2019社区版是免费的,前提是你得登陆自己的账户,如果一开始安装时没有登陆,那么就会只有30天有效期。此时,需要我们登陆微软账号,重新验证即可。 登陆微软账号,即可继续免费试用。

【万字长文】使用 LSM Tree 思想实现一个 KV 数据库

目录设计思路内存表WALSSTable 的结构SSTable 元素和索引的结构SSTable Tree内存中的 SSTable数据查找过程何为 LSM-Treee参考资料整体结构实现过程文件压缩测试插入测试加载测试查找测试SSTable 结构SSTable 文件结构SSTable Tree 结构和管理 SSTable 文件读取 SSTable 文件SS…

记录部件中GetFieldControlByFieldName(字段值样式设置)用法

度量快速开发平台中,记录部件上,不单是字段名称可以设置样式,要填入内容的方框也可以设置样式。通过获取记录部件上某一个字段的输入控件,在二次开发中不常用。该方法只有一个参数,即要获取对象的字段,需要…

C/C++/Linux工程师学习资料干货路线这都有,从入门到实战!【CSDN宝藏资料图鉴第二期】

若是大一学子或者是真心想学习刚入门的小伙伴可以私聊我,若你是真心学习可以送你书籍,指导你学习,给予你目标方向的学习路线,无套路,博客为证。 前言 CSDN 是全球知名的开发者社区,创建于1999年&#xff…

你要的来了:ArcGIS空间插值分析方法权威解读

插值问题的提出??? 一、趋势面 Trend is a global polynomial interpolation that fits a smooth surface defined by a mathematical function (a

Socket解决粘包问题2

在AsynServer中对接收函数增加接收判断,如果收到客户端发送的请求信息,则发送10个测试包给发送端,否则继续接收,修改后的接收代码如下: private void AsynReceive(){byte[] data new byte[1024];//接收缓存string rec…

保姆级的HTML零基础教程少见吧?这是第一节(1)

作者简介 作者名:1_bit 简介:CSDN博客专家,2020年博客之星TOP5,蓝桥签约作者。15-16年曾在网上直播,带领一批程序小白走上程序员之路。欢迎各位小白加我咨询我相关信息,迷茫的你会找到答案。 目录 HTML基…

WPF 通用权限开发框架 (ABP)

前言对于大部分.NET 开发者来说, 都比较熟悉目前流行的ABP框架, 基于开源的ABP框架, 可以自己进行二次开发, 无需重新开发一些基础功能,例如: 用户角色管理、权限、组织、多租户等等。但是对于ABP框架来说, 提供给.NET开发者的可选项非常少, 目前也仅仅是提供了基于Web的解决方…

MongoDB 3.0 新增特性一览

引言 在历经版本号修改(2.8版本直接跳到3.0版本)和11个rc版本之后,MongoDB3.0于2015年3月3日正式发布。可以毫不夸张的说,该版本的新增特性标志着MongoDB这款典型的NoSQL数据库已经进入了一个全新的发展阶段。本文以下内容会逐个盘…

淘宝网的技术发展史(一)——个人网站时代

《天下网商经理人》十月刊开始将连载系列文章《淘宝网的技术发展史》,为读者描述淘宝网在整个发展过程中,所有的主动和被动的技术变革的前因后果。 文/淘宝技术大学培训专家 子柳 前言 11月11日,这个棍子最多的日子被网民自我调侃变成了一个…

使用 Vscode 编写 HTML 文档竟然可以自动写代码(2)

作者简介 作者名:1_bit 简介:CSDN博客专家,2020年博客之星TOP5,蓝桥签约作者。15-16年曾在网上直播,带领一批程序小白走上程序员之路。欢迎各位小白加我咨询我相关信息,迷茫的你会找到答案。 目录 HTML基…

为什么 Docker 和 Kubernetes 是用 Go 写的而不是 C# ?

这是 Reddit 平台上面这几天一篇比较热门的帖子, 非常有意思,本文我列出了几个高赞的回答。👦 HahahahahaSoFunny为什么 Docker 和 Kubernetes 工具是用 Go 写的而不是 C#?总所周知,现在开发人员使用的很多新工具大多是用 Go 写的…

打造最舒适的webview调试环境

你在做移动web开发的时候是不是只是在Chrome下开启移动模式,然后就啪啪啪闷头敲代码了?如果你平时只是做做宣传页,Chrome的移动模式可能就能满足你。但是现在越来越多的应用采用Hybrid的开发方式,这样的话就可能在web页面上调用we…

淘宝网的技术发展史(二) ——Oracle替换MySQL

本文是《淘宝网的技术发展史》系列连载文的第二篇,在告别个人网站时代后,淘宝网的技术发展迎来了由Oracle开启的第二个时代。文/淘宝技术大学培训专家 子柳MySQL撑不住了 淘宝网作为个人网站发展的时间其实并不长,由于它太引人注目了&#xf…

Android之抓取adb logcat全日志后怎么过滤掉只包含当前app进程的日志(一般抓启动app奔溃日志)

1 、问题 有时候我们启动APP的时候,APP奔溃,在android studio里面日志可能冲掉,或者是云平台的手机安装的app,根本就没有android stduio,那我们用什么办法快速知道启动奔溃日志呢? 2、解决办法 我们先需要…

一个基础的 HTML 文档有哪些标签?(3)

作者简介 作者名:1_bit 简介:CSDN博客专家,2020年博客之星TOP5,蓝桥签约作者。15-16年曾在网上直播,带领一批程序小白走上程序员之路。欢迎各位小白加我咨询我相关信息,迷茫的你会找到答案。 目录 HTML基…

能上架App的GooglePlay开发者账号获取流程

googleplay 开发者账号申请流程 接到公司号召,要让我们的app走向世界,上架GooglePlay,都说天朝的Android 程序员是折翼的天使,猛然发现写了做么多年的Android,竟然不知道怎么成为GooglePlay开发者。 以前尝试过&#x…

如何让 ASP.NET Core 支持绑定查询字符串中的数组(2)

前言上回说到,我们实现了IntArrayModelBinder,可以让 ASP.NET Core 绑定查询字符串中的数组。但是必须显示指定ModelBinder:public string Get([FromQuery][ModelBinder(BinderType typeof(IntArrayModelBinder))] int[] values)而官方提供的…

淘宝网的技术发展史(三)——分布式时代

本文是《淘宝网的技术发展史》系列连载文的第三篇。在系统发展的过程中,架构师的眼光至关重要,作为程序员,把功能实现即可;但作为架构师,要考虑系统的扩展性、复用性,这种敏锐的感觉,有人说是一…

你知道出现“乱码”的原因是什么吗?(4)

作者简介 作者名:1_bit 简介:CSDN博客专家,2020年博客之星TOP5,蓝桥签约作者。15-16年曾在网上直播,带领一批程序小白走上程序员之路。欢迎各位小白加我咨询我相关信息,迷茫的你会找到答案。 目录 HTML基…