网站域名等级,百度怎么创建网站,网站开发一般用什么数据库,云服务器是虚拟技术吗场景介绍
NativeWindow 是 HarmonyOS 本地平台化窗口#xff0c;表示图形队列的生产者端。开发者可以通过 NativeWindow 接口进行申请和提交 Buffer#xff0c;配置 Buffer 属性信息。
针对 NativeWindow#xff0c;常见的开发场景如下#xff1a;
● 通过 NativeWindow…场景介绍
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_castvoid**(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_castOHNativeWindow*(window); // ...}void OnSurfaceChangedCB(OH_NativeXComponent* component, void* window){ // 可获取 OHNativeWindow 实例 OHNativeWindow* nativeWindow static_castOHNativeWindow*(window); // ...}void OnSurfaceDestroyedCB(OH_NativeXComponent* component, void* window){ // 可获取 OHNativeWindow 实例 OHNativeWindow* nativeWindow static_castOHNativeWindow*(window); // ...}void DispatchTouchEventCB(OH_NativeXComponent* component, void* window){ // 可获取 OHNativeWindow 实例 OHNativeWindow* nativeWindow static_castOHNativeWindow*(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_castuint32_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}