黑河市网站建设_网站建设公司_ASP.NET_seo优化
2026/1/16 15:42:26 网站建设 项目流程

目录


stable-c HAL 实例分析

在 HIDL HAL 中 聊过 Same-Process HALs,这类 hal 的调用对性能要求高,一般直接链接,不适用跨进程的方式来调用。

在 AIDL HAL 中,与之对应的是 stable-c HAL。stable-c HAL 就是一个对外接口稳定的 so 库。

接着我们来看一个源码中的 stable-c HAL,hardware/interfaces/graphics/mapper

这里只是给出一个框架,具体需要芯片厂商来做实现。

其中最重要的就是hardware/interfaces/graphics/mapper/stable-c/implutils/include/android/hardware/graphics/mapper/utils/IMapperProvider.h,其中的IMapperV5Impl就是 stable-c HAL 的对外接口:

structIMapperV5Impl{staticconstautoversion=AIMAPPER_VERSION_5;virtual~IMapperV5Impl()=default;virtual AIMapper_ErrorimportBuffer(constnative_handle_t*_Nonnull handle,buffer_handle_t_Nullable*_Nonnull outBufferHandle)=0;virtual AIMapper_ErrorfreeBuffer(buffer_handle_t_Nonnull buffer)=0;virtual AIMapper_ErrorgetTransportSize(buffer_handle_t_Nonnull buffer,uint32_t*_Nonnull outNumFds,uint32_t*_Nonnull outNumInts)=0;virtual AIMapper_Errorlock(buffer_handle_t_Nonnull buffer,uint64_tcpuUsage,ARect accessRegion,intacquireFence,void*_Nullable*_Nonnull outData)=0;virtual AIMapper_Errorunlock(buffer_handle_t_Nonnull buffer,int*_Nonnull releaseFence)=0;virtual AIMapper_ErrorflushLockedBuffer(buffer_handle_t_Nonnull buffer)=0;virtual AIMapper_ErrorrereadLockedBuffer(buffer_handle_t_Nonnull buffer)=0;virtualint32_tgetMetadata(buffer_handle_t_Nonnull buffer,AIMapper_MetadataType metadataType,void*_Nullable destBuffer,size_tdestBufferSize)=0;virtualint32_tgetStandardMetadata(buffer_handle_t_Nonnull buffer,int64_tstandardMetadataType,void*_Nullable destBuffer,size_tdestBufferSize)=0;virtual AIMapper_ErrorsetMetadata(buffer_handle_t_Nonnull buffer,AIMapper_MetadataType metadataType,constvoid*_Nonnull metadata,size_tmetadataSize)=0;virtual AIMapper_ErrorsetStandardMetadata(buffer_handle_t_Nonnull buffer,int64_tstandardMetadataType,constvoid*_Nonnull metadata,size_tmetadataSize)=0;virtual AIMapper_ErrorlistSupportedMetadataTypes(constAIMapper_MetadataTypeDescription*_Nullable*_Nonnull outDescriptionList,size_t*_Nonnull outNumberOfDescriptions)=0;virtual AIMapper_ErrordumpBuffer(buffer_handle_t_Nonnull bufferHandle,AIMapper_DumpBufferCallback _Nonnull dumpBufferCallback,void*_Null_unspecified context)=0;virtual AIMapper_ErrordumpAllBuffers(AIMapper_BeginDumpBufferCallback _Nonnull beginDumpBufferCallback,AIMapper_DumpBufferCallback _Nonnull dumpBufferCallback,void*_Null_unspecified context)=0;virtual AIMapper_ErrorgetReservedRegion(buffer_handle_t_Nonnull buffer,void*_Nullable*_Nonnull outReservedRegion,uint64_t*_Nonnull outReservedSize)=0;};

Google 给出了一个模拟器的实现/external/minigbm/cros_gralloc/mapper_stablec

external/minigbm/cros_gralloc/mapper_stablec/Mapper.cpp中实现了一个 CrosGrallocMapperV5 类继承自 IMapperV5Impl,实现了所有的对外接口。

另外,定义了两个对外的入口符号:

extern"C"uint32_tANDROID_HAL_MAPPER_VERSION=AIMAPPER_VERSION_5;extern"C"AIMapper_ErrorAIMapper_loadIMapper(AIMapper*_Nullable*_Nonnull outImplementation){staticvendor::mapper::IMapperProvider<CrosGrallocMapperV5>provider;returnprovider.load(outImplementation);}

使用 mapper hal 的程序可以通过 AIMapper_loadIMapper 获取AIMapper指针,AIMapper内部的函数最终都会调用到 CrosGrallocMapperV5 类中的具体实现中。

这里两个符号都使用 extern “C” 修饰,也就是, c 和 cpp 程序都可以使用这两个符号来使用 mapper 模块。


需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询