Android帧缓冲区(Frame Buffer)硬件抽象层(HAL)模块Gralloc的实现原理分析(2)
函数load也是实现在文件hardware/libhardware/hardware.c文件中,如下所示:
- staticintload(constchar*id,
- constchar*path,
- conststructhw_module_t**pHmi)
- {
- intstatus;
- void*handle;
- structhw_module_t*hmi;
- /*
- *loadthesymbolsresolvingundefinedsymbolsbefore
- *dlopenreturns.SinceRTLD_GLOBALisnotor'dinwith
- *RTLD_NOWtheexternalsymbolswillnotbeglobal
- */
- handle=dlopen(path,RTLD_NOW);
- if(handle==NULL){
- charconst*err_str=dlerror();
- LOGE("load:module=%s\n%s",path,err_str?err_str:"unknown");
- status=-EINVAL;
- gotodone;
- }
- /*Gettheaddressofthestructhal_module_info.*/
- constchar*sym=HAL_MODULE_INFO_SYM_AS_STR;
- hmi=(structhw_module_t*)dlsym(handle,sym);
- if(hmi==NULL){
- LOGE("load:couldn'tfindsymbol%s",sym);
- status=-EINVAL;
- gotodone;
- }
- /*Checkthattheidmatches*/
- if(strcmp(id,hmi->id)!=0){
- LOGE("load:id=%s!=hmi->id=%s",id,hmi->id);
- status=-EINVAL;
- gotodone;
- }
- hmi->dso=handle;
- /*success*/
- status=0;
- done:
- if(status!=0){
- hmi=NULL;
- if(handle!=NULL){
- dlclose(handle);
- handle=NULL;
- }
- }else{
- LOGV("loadedHALid=%spath=%shmi=%phandle=%p",
- id,path,*pHmi,handle);
- }
- *pHmi=hmi;
- returnstatus;
- }
- #defineHAL_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文件中,如下所示:
- staticstructhw_module_methods_tgralloc_module_methods={
- open:gralloc_device_open
- };
- structprivate_module_tHAL_MODULE_INFO_SYM={
- base:{
- common:{
- tag:HARDWARE_MODULE_TAG,
- version_major:1,
- version_minor:0,
- id:GRALLOC_HARDWARE_MODULE_ID,
- name:"GraphicsMemoryAllocatorModule",
- author:"TheAndroidOpenSourceProject",
- methods:&gralloc_module_methods
- },
- registerBuffer:gralloc_register_buffer,
- unregisterBuffer:gralloc_unregister_buffer,
- lock:gralloc_lock,
- unlock:gralloc_unlock,
- },
- framebuffer:0,
- flags:0,
- numBuffers:0,
- bufferMask:0,
- lock:PTHREAD_MUTEX_INITIALIZER,
- currentBuffer:0,
- };
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设备,后面我们再详细分析。
更多相关文章
- android 读写私有文件
- Android(安卓)SwipeMenuListView策滑实现各种删除和打开功能
- No usable Android(安卓)build tools found. Highest installed
- android-ndk-r6b编译NDK
- Android(安卓)资源文件错误排查 Process 'command ' 等错误排查
- Android实现文件目录的选择并保存到SharedPreferences中(适配6.0
- unity调用aar包 适配AndroidX冲突
- Develop--Training(五)Getting Started--Saving Data
- apk 反编译 教程 (不支持混淆,Android)