当前位置: 首页 > news >正文

鸿蒙 与Android NativeWindow 接口对比及实现分析

Android 的图形栈大家都熟悉:SurfaceFlinger+BufferQueue+ANativeWindow。鸿蒙也是类似的生产者-消费者模型,只是接口命名和实现细节有些不同。

作为 GPU 开发者,需要在 winsys 层对接系统窗口。Android 用ANativeWindow_*,鸿蒙用OH_NativeWindow_*,看着差不多,真移植起来发现坑不少。

一、核心接口映射

功能Android鸿蒙 OHOS 6.1
请求 BufferANativeWindow_dequeueBuffer()OH_NativeWindow_NativeWindowRequestBuffer()
提交 BufferANativeWindow_queueBuffer()OH_NativeWindow_NativeWindowFlushBuffer()
取消 BufferANativeWindow_cancelBuffer()OH_NativeWindow_NativeWindowAbortBuffer()
获取 BufferHandleANativeWindowBuffer_getHardwareBuffer()OH_NativeWindow_GetBufferHandleFromNative()
引用计数+1ANativeWindow_acquire()OH_NativeWindow_NativeObjectReference()
引用计数-1ANativeWindow_release()OH_NativeWindow_NativeObjectUnreference()

二、属性操作对比

Android:独立函数

ANativeWindow_setUsage(window,usage);ANativeWindow_setBuffersDimensions(window,width,height);ANativeWindow_setBuffersFormat(window,format);ANativeWindow_setBuffersTransform(window,transform);ANativeWindow_setSwapInterval(window,interval);// 查询intwidth,height;ANativeWindow_query(window,ANATIVEWINDOW_QUERY_DEFAULT_WIDTH,&width);

鸿蒙:统一 HandleOpt

// 设置OH_NativeWindow_NativeWindowHandleOpt(window,SET_USAGE,usage);OH_NativeWindow_NativeWindowHandleOpt(window,SET_BUFFER_GEOMETRY,width,height);OH_NativeWindow_NativeWindowHandleOpt(window,SET_FORMAT,format);OH_NativeWindow_NativeWindowHandleOpt(window,SET_TRANSFORM,transform);// 查询intwidth,height;OH_NativeWindow_NativeWindowHandleOpt(window,GET_BUFFER_GEOMETRY,&height,&width);

三、提交 Buffer 差异

Android

// 仅需 release fenceANativeWindow_queueBuffer(window,buffer,release_fence);

鸿蒙

// 需要 release fence + Region 脏区Region region={.rects=nullptr,// nullptr = 全屏.rectNumber=0};OH_NativeWindow_NativeWindowFlushBuffer(window,buffer,release_fence,region);

四、NativeWindowOperation 枚举

CodeAndroid 等效参数
SET_BUFFER_GEOMETRYsetBuffersDimensionsint32_t width, int32_t height
GET_BUFFER_GEOMETRYquery width/heightint32_t *height, int32_t *width
SET_FORMATsetBuffersFormatint32_t format
GET_FORMATgetFormatint32_t *format
SET_USAGEsetUsageuint64_t usage
GET_USAGEquery usageuint64_t *usage
SET_TIMEOUTint32_t timeout (ms)
GET_TIMEOUTint32_t *timeout
SET_COLOR_GAMUTsetBuffersDataSpaceint32_t colorGamut
GET_COLOR_GAMUTgetBuffersDataSpaceint32_t *colorGamut
SET_TRANSFORMsetBuffersTransformint32_t transform
GET_TRANSFORMquery transformint32_t *transform
SET_UI_TIMESTAMPsetBuffersTimestampuint64_t timestamp
GET_BUFFERQUEUE_SIZEquery min undequeuedint32_t *size
SET_SOURCE_TYPEint32_t sourceType
GET_SOURCE_TYPEint32_t *sourceType
SET_APP_FRAMEWORK_TYPEchar *frameworkType
GET_APP_FRAMEWORK_TYPEchar **frameworkType
SET_HDR_WHITE_POINT_BRIGHTNESSfloat brightness
SET_SDR_WHITE_POINT_BRIGHTNESSfloat brightness
SET_DESIRED_PRESENT_TIMESTAMPint64_t timestamp

五、鸿蒙特有接口

接口功能
OH_NativeWindow_LockBuffer()CPU 锁定 Buffer 直接访问
OH_NativeWindow_UnlockAndFlushBuffer()CPU 解锁并提交
OH_NativeWindow_PreAllocBuffers()预分配 Buffer
OH_NativeWindow_CleanCache()清理 Buffer 缓存
OH_NativeWindow_NativeWindowAttachBuffer()Attach Buffer 到窗口
OH_NativeWindow_NativeWindowDetachBuffer()从窗口 Detach Buffer
OH_NativeWindow_GetSurfaceId()获取 SurfaceId
OH_NativeWindow_CreateNativeWindowFromSurfaceId()从 SurfaceId 创建窗口
OH_NativeWindow_WriteToParcel()/ReadFromParcel()IPC 序列化
OH_NativeWindow_GetLastFlushedBufferV2()获取最后提交的 Buffer
OH_NativeWindow_SetBufferHold()保持 Buffer 不被回收

六、BufferHandle 结构

Android:AHardwareBuffer

// opaque 结构,通过 API 访问AHardwareBuffer_Desc desc;AHardwareBuffer_describe(buffer,&desc);

鸿蒙:BufferHandle

// 明确定义,直接访问typedefstructBufferHandle{int32_tfd;// DMA-BUF fduint32_treserveInts;// reserve 数组大小int32_treserve[0];// 变长数据:width, height, stride, format...}BufferHandle;// 获取方式BufferHandle*handle=OH_NativeWindow_GetBufferHandleFromNative(buffer);// 直接访问:handle->fd, handle->reserve[0]...

七、完整流程对比

Buffer 获取与提交

Android: ANativeWindow_dequeueBuffer() │ ▼ ┌───────────────┐ │ acquire_fence │ └───────┬───────┘ │ ▼ GPU 渲染完成 │ ▼ ANativeWindow_queueBuffer() (buffer, release_fence) 鸿蒙: OH_NativeWindow_NativeWindowRequestBuffer() │ ▼ ┌───────────────┐ │ acquire_fence │ └───────┬───────┘ │ ▼ GPU 渲染完成 │ ▼ OH_NativeWindow_NativeWindowFlushBuffer() (buffer, release_fence, Region)

八、HandleOpt 分发表实现

// foundation/graphic/graphic_surface/surface/src/native_window.cppstaticstd::map<int,std::function<void(OHNativeWindow*,va_list)>>operationMap={{SET_USAGE,HandleNativeWindowSetUsage},{SET_BUFFER_GEOMETRY,HandleNativeWindowSetBufferGeometry},{SET_FORMAT,HandleNativeWindowSetFormat},{SET_TIMEOUT,HandleNativeWindowSetTimeout},{SET_COLOR_GAMUT,HandleNativeWindowSetColorGamut},{SET_TRANSFORM,HandleNativeWindowSetTransform},{SET_UI_TIMESTAMP,HandleNativeWindowSetUiTimestamp},{SET_SOURCE_TYPE,HandleNativeWindowSetSurfaceSourceType},{SET_APP_FRAMEWORK_TYPE,HandleNativeWindowSetSurfaceAppFrameworkType},{SET_HDR_WHITE_POINT_BRIGHTNESS,HandleNativeWindowSetHdrWhitePointBrightness},{SET_SDR_WHITE_POINT_BRIGHTNESS,HandleNativeWindowSetSdrWhitePointBrightness},{SET_DESIRED_PRESENT_TIMESTAMP,HandleNativeWindowSetDesiredPresentTimestamp},{GET_USAGE,HandleNativeWindowGetUsage},{GET_BUFFER_GEOMETRY,HandleNativeWindowGetBufferGeometry},{GET_FORMAT,HandleNativeWindowGetFormat},{GET_TIMEOUT,HandleNativeWindowGetTimeout},{GET_COLOR_GAMUT,HandleNativeWindowGetColorGamut},{GET_TRANSFORM,HandleNativeWindowGetTransform},{GET_BUFFERQUEUE_SIZE,HandleNativeWindowGetBufferQueueSize},{GET_SOURCE_TYPE,HandleNativeWindowGetSurfaceSourceType},{GET_APP_FRAMEWORK_TYPE,HandleNativeWindowGetSurfaceAppFrameworkType},};int32_tOH_NativeWindow_NativeWindowHandleOpt(OHNativeWindow*window,intcode,...){va_list args;va_start(args,code);autoit=operationMap.find(code);if(it!=operationMap.end()){it->second(window,args);}va_end(args);returnOHOS::GSERROR_OK;}

九、头文件与链接库

Android鸿蒙
头文件<android/native_window.h><native_window/external_window.h>
<android/hardware_buffer.h><native_buffer/buffer_handle.h>
链接库-lui -lgui-lnative_window -lsurface.z

近期我将android gpu代码移植鸿蒙发现不少知识点,在此总结。后续会讲部分实现接口!

http://www.jsqmd.com/news/718602/

相关文章:

  • 2026年上海办公绿植租赁怎么选?森永园艺用33年经验解决企业4大核心痛点 - 速递信息
  • Vivado 2023.1实战:在ZYNQ上配置AXI Timer生成PWM波控制舵机(含示波器实测)
  • 盘点六大海底光缆路由,数字孪生赋能扩容规划
  • SpringAI + RAG + MCP + Agent 零基础全栈实战(完结篇)| 27课完整汇总,Java开发者AI转型必看
  • 别再让脏数据入库了!用EasyExcel+自定义监听器,搞定Excel导入的6种常见校验(附完整代码)
  • 任何事情只有一个核心点-剩下都用草台班子的方式就好了
  • Linux 超详细安装 MySQL+Redis 及基础实操指南(新手保姆级)
  • 引言:为什么矩阵乘法是GPU计算的“Hello World“
  • TCP 粘包
  • 2026年谷歌优化推广服务商深度盘点:技术优劣势与实战案例分析 - 深圳昊客网络
  • OnStep:开源天文望远镜控制器的革命性解决方案
  • 拆解 Paperxie 毕业论文写作界面:4 步流程 + 细节设计,让你的论文从 0 到 1 不走弯路
  • CompressO:终极免费开源跨平台视频图像压缩工具完全指南
  • 任何业务-我们都先讨论资金的流转-先v50w看看实力
  • 二刷hot100-160.相交链表
  • 终极网盘下载加速指南:3步解锁8大平台高速通道
  • 融资或者你合伙人融资-你必须要了解思考的问题
  • Android 广告 SDK 接入避坑指南:从入门到收益翻倍
  • 企业家培训只不过是商业闭环中很小的一环
  • 软考笔记:信息系统项目管理师-五大过程组详解-记忆送分50题
  • EI会议第二轮征稿!IOP-JPCS出版 | 2026年内燃机技术与能源动力工程国际学术会议(ICTEPE 2026) - RDLink研发家
  • 避开这3个坑!Vector CANoe工程配置中的硬件通道与License权限检查指南
  • 扫雷小游戏
  • 众智商学院CPPM深圳班通知函 - 众智商学院课程中心
  • 千万别在朋友圈-网络上和空气斗智斗勇
  • R3nzSkin国服换肤:英雄联盟免费皮肤个性化定制终极方案
  • 用QGC规划航线让Gazebo里的垂起固定翼自动飞行:一个完整的任务流程演示
  • 融资路演上有哪些要说-哪些不要说的
  • 49F继电器选购指南:选型要点与拿样流程费用全解析 - 速递信息
  • 挽回超50亿损失:韩宝玉律师胜诉案例解析 - 速递信息