HarmonyOS:NativeWindow 开发指导

【鸿蒙实战开发】媒体开发-视频编码详解 开发者可以调用本模块的Native API接口,完成视频编码,即将未压缩的视频数据压缩成视频码流 阅读详情

场景介绍

NativeWindow 是 HarmonyOS 本地平台化窗口,表示图形队列的生产者端。开发者可以通过 NativeWindow 接口进行申请和提交 Buffer,配置 Buffer 属性信息。

针对 NativeWindow,常见的开发场景如下:

● 通过 NativeWindow 提供的 Native API 接口申请图形 Buffer,并将生产图形内容写入图形 Buffer,最终提交 Buffer 到图形队列

● 在适配 EGL 层的 eglswapbuffer 接口时,进行申请和提交 Buffer

接口说明

详细的接口说明请参考native_window。

开发步骤

以下步骤描述了在 HarmonyOS 中如何使用 NativeWindow 提供的 Native API 接口,申请图形 Buffer,并将生产图形内容写入图形 Buffer 后,最终提交 Buffer 到图形队列。

添加动态链接库

CMakeLists.txt 中添加以下 lib。

libace_ndk.z.solibnative_window.so

头文件

#include <ace/xcomponent/native_interface_xcomponent.h>#include <native_window/external_window.h>

1.  获取 OHNativeWindow 实例。

可在OH_NativeXComponent_Callback提供的接口中获取 OHNativeWindow,下面提供一份代码示例。XComponent 模块的具体使用方法请参考XComponent开发指导。

a.  在 xxx.ets 中添加一个 XComponent 组件。

XComponent({ id: 'xcomponentId', type: 'surface', libraryname: 'entry'})    .width(360)    .height(360)

b.  在 native c++ 层获取 NativeXComponent。

napi_value exportInstance = nullptr;// 用来解析出被wrap了NativeXComponent指针的属性napi_get_named_property(env, exports, OH_NATIVE_XCOMPONENT_OBJ, &exportInstance);OH_NativeXComponent *nativeXComponent = nullptr;// 通过napi_unwrap接口,解析出NativeXComponent的实例指针napi_unwrap(env, exportInstance, reinterpret_cast<void**>(&nativeXComponent));// 获取XComponentIdchar idStr[OH_XCOMPONENT_ID_LEN_MAX + 1] = {};uint64_t idSize = OH_XCOMPONENT_ID_LEN_MAX + 1;OH_NativeXComponent_GetXComponentId(nativeXComponent, idStr, &idSize);

c.  定义 OH_NativeXComponent_Callback。

// 定义回调函数void OnSurfaceCreatedCB(OH_NativeXComponent* component, void* window){    // 可获取 OHNativeWindow 实例    OHNativeWindow* nativeWindow = static_cast<OHNativeWindow*>(window);    // ...}void OnSurfaceChangedCB(OH_NativeXComponent* component, void* window){    // 可获取 OHNativeWindow 实例    OHNativeWindow* nativeWindow = static_cast<OHNativeWindow*>(window);    // ...}void OnSurfaceDestroyedCB(OH_NativeXComponent* component, void* window){    // 可获取 OHNativeWindow 实例    OHNativeWindow* nativeWindow = static_cast<OHNativeWindow*>(window);    // ...}void DispatchTouchEventCB(OH_NativeXComponent* component, void* window){    // 可获取 OHNativeWindow 实例    OHNativeWindow* nativeWindow = static_cast<OHNativeWindow*>(window);    // ...}


// 初始化 OH_NativeXComponent_CallbackOH_NativeXComponent_Callback callback;callback.OnSurfaceCreated = OnSurfaceCreatedCB;callback.OnSurfaceChanged = OnSurfaceChangedCB;callback.OnSurfaceDestroyed = OnSurfaceDestroyedCB;callback.DispatchTouchEvent = DispatchTouchEventCB;

d.  将 OH_NativeXComponent_Callback 注册给 NativeXComponent。

// 注册回调函数OH_NativeXComponent_RegisterCallback(nativeXComponent, &callback);

2.  设置 OHNativeWindowBuffer 的属性。使用 OH_NativeWindow_NativeWindowHandleOpt 设置 OHNativeWindowBuffer 的属性。

// 设置 OHNativeWindowBuffer 的宽高
int32_t code = SET_BUFFER_GEOMETRY;
int32_t width = 0x100;
int32_t height = 0x100;
// 这里的nativeWindow是从上一步骤中的回调函数中获得的
int32_t ret = OH_NativeWindow_NativeWindowHandleOpt(nativeWindow, code, width, height);

3.  从图形队列申请 OHNativeWindowBuffer。

OHNativeWindowBuffer* buffer = nullptr;int fenceFd;// 通过 OH_NativeWindow_NativeWindowRequestBuffer 获取 OHNativeWindowBuffer 实例OH_NativeWindow_NativeWindowRequestBuffer(nativeWindow, &buffer, &fenceFd);// 通过 OH_NativeWindow_GetBufferHandleFromNative 获取 buffer 的 handleBufferHandle* bufferHandle = OH_NativeWindow_GetBufferHandleFromNative(buffer);

4.  内存映射 mmap。

#include <sys/mman.h>

// 使用系统接口mmap将bufferHandle对应的共享内存映射到用户空间,可以通过映射出来的虚拟地址向bufferHandle中写入图像数据
// bufferHandle->virAddr是bufferHandle在共享内存中的起始地址,bufferHandle->size是bufferHandle在共享内存中的内存占用大小
void* mappedAddr = mmap(bufferHandle->virAddr, bufferHandle->size, PROT_READ | PROT_WRITE, MAP_SHARED, bufferHandle->fd, 0);
if (mappedAddr == MAP_FAILED) {
    // mmap failed
}

5.  将生产的内容写入 OHNativeWindowBuffer。

static uint32_t value = 0x00;
value++;
uint32_t *pixel = static_cast<uint32_t *>(mappedAddr); // 使用mmap获取到的地址来访问内存
for (uint32_t x = 0; x < width; x++) {
    for (uint32_t y = 0;  y < height; y++) {
        *pixel++ = value;
    }
}

6.  提交 OHNativeWindowBuffer 到图形队列。

// 设置刷新区域,如果Region中的Rect为nullptr,或者rectNumber为0,则认为OHNativeWindowBuffer全部有内容更改。
Region region{nullptr, 0};
// 通过OH_NativeWindow_NativeWindowFlushBuffer 提交给消费者使用,例如:显示在屏幕上。
OH_NativeWindow_NativeWindowFlushBuffer(nativeWindow, buffer, fenceFd, region);

7.  取消内存映射 munmap。

// 内存使用完记得去掉内存映射int result = munmap(mappedAddr, bufferHandle->size);if (result == -1) {    // munmap failed}

OpenHarmony实战开发-如何实现自定义绘制 (XComponent) XComponent组件作为一种绘制组件,通常用于满足开发者较为复杂的自定义绘制需求,例如相机预览流的显示和游戏画面的绘制。 阅读详情

相关推荐

HarmonyOS Next开发学习手册——添加组件(Native XComponent)

Native XComponent是XComponent组件提供在Native层的实例,可作为JS层和Native层XComponent绑定的桥梁。XComponent所提供的NDK接口都依赖于该实例。接口能力包括获取Native Window实例、获取XComponent的布局/事件信息、注册XComponent的生命周期回调、注册XComponent的触摸、鼠标、按键等事件回调。利用Native XComponent提供的接口注册XComponent的生命周期和事件回调。

maniuT的博客 1158

鸿蒙端H5容器化建设——JSB通信机制建设

本文概述了鸿蒙系统的架构以及开发模式,并且指出鸿蒙的适配工作任重而道远。其中,Native侧的迁移适配需要大量的时间和成本;而H5作为天然的跨端生态,尤其是在业务中本来就有很重的业务承载,那么H5容器化是首先要去适配的。ArkTS与H5的JSB通信机制则是本文的重点描述内容,剩下的H5容器所需的Native能力,则需要一点一点去补齐。

关于Android开发的一些技术点总结 ╮( ̄▽ ̄”)╭ 3712

鸿蒙实战开发(HarmonyOS)NativeWindow开发指导 (C/C++)

NativeWindow是本地平台化窗口,表示图形队列的生产者端。开发者可以通过NativeWindow接口进行申请和提交Buffer,配置Buffer属性信息。

wea22984984的博客 1222

鸿蒙(API 12 Beta6版)图形【NativeWindow开发指导 (C/C++)】方舟2D图形服务

NativeWindow是**本地平台化窗口**,表示图形队列的生产者端。开发者可以通过NativeWindow接口进行申请和提交Buffer,配置Buffer属性信息。

鸿蒙的技术博客 1513

鸿蒙开发-如何使用Native XComponent接口来获取NativeWindow实例

本示例中主要介绍开发者如何使用Native XComponent接口来获取NativeWindow实例、获取布局/事件信息、注册事件回调并通过OpenGL/EGL实现在页面上绘制形状。功能主要包括点击按钮绘制一个五角星,并可以通过点击XComponent区域改变五角星的颜色。

2401_82546228的博客 1372

鸿蒙HarmonyOS实战-窗口管理_鸿蒙nativewindow 获取窗口

窗口模块是在同一块物理屏幕上提供多个应用界面显示和交互的机制。对应用开发者而言,窗口模块是一个重要的工具,它允许他们创建具有界面的应用程序,并提供了界面显示和交互的能力。通过窗口模块,开发者可以方便地管理窗口的创建、展示和关闭,并可以对窗口进行调整和布局,以满足用户的需求。而对终端用户而言,窗口模块提供了一种控制应用界面的方式。用户可以通过窗口模块来切换和控制不同应用程序的窗口,使得他们能够同时在屏幕上显示多个应用界面,并能够在这些界面之间进行交互和操作。

2401_84181108的博客 1425

鸿蒙5.0&next开发【NativeWindow开发】图形

NativeWindow是**本地平台化窗口**,表示图形队列的生产者端。开发者可以通过`NativeWindow`接口进行申请和提交`Buffer`,配置`Buffer`属性信息。

bbq的博客 733

鸿蒙HarmonyOS实战-窗口管理_鸿蒙nativewindow 获取窗口(1)

主窗口的"是否可触"属性是指能否通过触摸屏与用户进行交互。如果主窗口的"是否可触"属性为True,则用户可以通过触摸屏对主窗口进行操作,例如点击按钮、滑动界面等。如果主窗口的"是否可触"属性为False,则用户无法通过触摸屏进行交互,只能使用其他输入设备(如鼠标)进行操作。通常情况下,移动设备(如手机、平板电脑)上的主窗口会设置为可触摸,而桌面电脑上的主窗口可能会设置为不可触摸。// 1.获取应用主窗口。return;// 2.设置主窗口属性。以设置"是否可触"属性为例。

2401_84182073的博客 1243

HarmonyOS实战开发:XComponent-常用组件

XComponent组件作为一种绘制组件,通常用于满足开发者较为复杂的自定义绘制需求

2401_84194030的博客 1874

鸿蒙实战开发(HarmonyOS)NativeImage开发指导 (C/C++)

NativeImage是提供Surface关联OpenGL外部纹理的模块,表示图形队列的消费者端。开发者可以通过NativeImage接口接收和使用Buffer,并将Buffer关联输出到OpenGL外部纹理。

wea22984984的博客 918

【鸿蒙开发示例代码】简单时钟

本篇Sample主要介绍如何使用Drawing绘制一个bitmap,然后通过NativeWindow贴图到XComponent的双缓冲实现。双缓冲:在内存中创建一片内存区域,把将要绘制的图片预先绘制到内存中,在绘制显示的时候直接获取缓冲区的图片进行绘制。更具体一点来说:先通过Drawing方法将要绘制的所有的图形绘制到一个Bitmap上也就是先在内存空间完成,然后获取位图的像素地址、并将其拷贝到XComponent的NativeWindow地址。完成贴图,将图片显示在屏幕上。

weixin_44349071的博客 598

鸿蒙HarmonyOS实战-窗口管理_鸿蒙nativewindow 获取窗口(2)

(**ArkTS、ArkUI开发组件、Stage模型、多端部署、分布式应用开发、音频、视频、WebGL、OpenHarmony****多媒体技术、Napi组件、OpenHarmony内核、Harmony南向开发、鸿蒙项目实战等等)鸿蒙(HarmonyOS NEXT)**技术知识点。应用子窗口是指在一个主窗口或父窗口之内创建一个较小的窗口,用于显示其他相关的内容或功能。// 开发者可以在适当的时机,如子窗口上点击关闭按钮等,销毁子窗口。// 开发者可以在适当的时机,如主窗口上按钮点击事件等,创建子窗口。

2401_84164469的博客 1077

鸿蒙启航:HarmonyOS 应用、游戏与 PC 开发工程师的深度探索与实践

本文深入探讨鸿蒙系统开发工程师的核心技能与开发实践,聚焦HarmonyOS应用/游戏和PC两大方向。鸿蒙开发工程师需具备底层硬件适配、系统优化、分布式技术等能力,同时熟练掌握ArkTS/ArkUI等应用开发框架。在应用/游戏开发方面,文章分析了鸿蒙的分布式优势、ArkUI核心概念及游戏开发要点;在PC开发方向,重点探讨了大屏适配、键鼠支持等关键技术。文中还提供了精选面试问题与解答,为开发者提供从技术原理到实践的全方位指导,助力构建鸿蒙生态。

郑伟强dev的专栏 205

鸿蒙系统中VideoDecoder解码到Surface的实践与探索

最初,我尝试使用鸿蒙系统的VideoDecoder进行视频解码,并希望将解码后的数据直接渲染到通过纹理ID创建的OHNativeWindow上。在鸿蒙系统的开发过程中,我遇到了一个关于视频解码的挑战:如何将VideoDecoder解码后的数据正确地渲染到绑定了纹理的OHNativeWindow上。经过上述步骤的调整,我重新运行了程序,并成功接收到了OH_OnFrameAvailableListener的回调,视频数据也正确地渲染到了OHNativeWindow上。确保了像素格式的正确设置。

qq_14863717的博客 1716

Microchip Studio 7.0 从下载到项目调试:AVR开发者的完整入门指南(附常见问题解决)

本文为AVR开发者提供了Microchip Studio 7.0从下载安装到项目调试的完整入门指南。详细介绍了如何获取安装包、创建第一个AVR工程项目,并配置编译与调试环境。同时,文章重点解决了开发过程中常见的编译错误和仿真问题,帮助开发者快速上手并高效使用这一官方集成开发环境。

joy55的博客 332

新手必看:TwinCAT死活扫不到倍福CX5020?别慌,先检查这3个地方(附静态IP配置)

本文详细介绍了TwinCAT软件无法扫描到倍福CX5020控制器的常见问题及解决方案。从网络连通性检查、系统环境配置到静态IP设置,提供了一套完整的排查流程和优化建议,帮助新手快速解决通信问题,确保设备稳定运行。

weixin_27219587的博客 362

【每日学点鸿蒙知识】长时任务、profiler allocation、事件订阅、getTagInfo、NativeWindow

约束限制可参见指导:https://developer.huawei.com/consumer/cn/doc/harmonyos-guides-V5/continuous-task-V5#%E7%BA%A6%E6%9D%9F%E4%B8%8E%E9%99%90%E5%88%B6。简单的说,申请完长时任务,系统会在5秒之内检测时都执行申请类型的长时任务,没有,就直接结束任务了,那再触发stopContinuousTask就会报这个错。

轻口味的专栏 1233

【C语言基础】野指针与空指针

全网最接地气的C语言野指针介绍,此处对于野指针与空指针知识点做一些简要的介绍,作者实属初学,写博客也是作者学习的一个过程,难免文章中有内容理解不到位或者有不当之处,还请朋友们不吝指正,希望大家多多给予支持,赠人玫瑰,手有余香! 文章目录一:野指针1.1 :野指针的成因2.1 :规避野指针二:空指针 一:野指针 概念:野指针就是指向的内存地址是未知的(随机的,不正确的,没有明确限制的)。 说明:指针变量也是变量,是变量就可以任意赋值。但是,任意数值赋值给指针变量没有意义,因为这样的指针就成了野指针,此指针指向

qq_43727529的博客 2万+
上一篇: Native Rawfile 开发指导
下一篇: 开发案例:使用 canvas 实现图表系列之折线图
「已注销」
博客等级 码龄5年 1045粉丝 297原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

「已注销」

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值