重慶有什么好玩的旅游景點(diǎn)寧波seo外包優(yōu)化
場景介紹
NativeWindow 是 HarmonyOS 本地平臺(tái)化窗口,表示圖形隊(duì)列的生產(chǎn)者端。開發(fā)者可以通過 NativeWindow 接口進(jìn)行申請和提交 Buffer,配置 Buffer 屬性信息。
針對 NativeWindow,常見的開發(fā)場景如下:
●?通過 NativeWindow 提供的 Native?API 接口申請圖形 Buffer,并將生產(chǎn)圖形內(nèi)容寫入圖形 Buffer,最終提交 Buffer 到圖形隊(duì)列
●?在適配 EGL 層的 eglswapbuffer 接口時(shí),進(jìn)行申請和提交 Buffer
接口說明
詳細(xì)的接口說明請參考native_window。
開發(fā)步驟
以下步驟描述了在 HarmonyOS 中如何使用 NativeWindow 提供的 Native?API 接口,申請圖形 Buffer,并將生產(chǎn)圖形內(nèi)容寫入圖形 Buffer 后,最終提交 Buffer 到圖形隊(duì)列。
添加動(dòng)態(tài)鏈接庫
CMakeLists.txt 中添加以下 lib。
libace_ndk.z.so
libnative_window.so
頭文件
#include?<ace/xcomponent/native_interface_xcomponent.h>
#include?<native_window/external_window.h>
1.? 獲取 OHNativeWindow 實(shí)例。
可在OH_NativeXComponent_Callback提供的接口中獲取 OHNativeWindow,下面提供一份代碼示例。XComponent 模塊的具體使用方法請參考XComponent開發(fā)指導(dǎo)。
a.? 在 xxx.ets 中添加一個(gè) 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的實(shí)例指針
napi_unwrap(env,?exportInstance, reinterpret_cast<void**>(&nativeXComponent));
//?獲取XComponentId
char?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。
//?定義回調(diào)函數(shù)
void OnSurfaceCreatedCB(OH_NativeXComponent*?component, void*?window)
{
//?可獲取?OHNativeWindow?實(shí)例
????OHNativeWindow*?nativeWindow?= static_cast<OHNativeWindow*>(window);
//?...
}
void OnSurfaceChangedCB(OH_NativeXComponent*?component, void*?window)
{
//?可獲取?OHNativeWindow?實(shí)例
????OHNativeWindow*?nativeWindow?= static_cast<OHNativeWindow*>(window);
//?...
}
void OnSurfaceDestroyedCB(OH_NativeXComponent*?component, void*?window)
{
//?可獲取?OHNativeWindow?實(shí)例
????OHNativeWindow*?nativeWindow?= static_cast<OHNativeWindow*>(window);
//?...
}
void DispatchTouchEventCB(OH_NativeXComponent*?component, void*?window)
{
//?可獲取?OHNativeWindow?實(shí)例
????OHNativeWindow*?nativeWindow?= static_cast<OHNativeWindow*>(window);
//?...
}
//?初始化?OH_NativeXComponent_Callback
OH_NativeXComponent_Callback?callback;
callback.OnSurfaceCreated?=?OnSurfaceCreatedCB;
callback.OnSurfaceChanged?=?OnSurfaceChangedCB;
callback.OnSurfaceDestroyed?=?OnSurfaceDestroyedCB;
callback.DispatchTouchEvent?=?DispatchTouchEventCB;
d.? 將?OH_NativeXComponent_Callback?注冊給?NativeXComponent。
//?注冊回調(diào)函數(shù)
OH_NativeXComponent_RegisterCallback(nativeXComponent, &callback);
2.? 設(shè)置 OHNativeWindowBuffer 的屬性。使用 OH_NativeWindow_NativeWindowHandleOpt 設(shè)置 OHNativeWindowBuffer 的屬性。
//?設(shè)置?OHNativeWindowBuffer?的寬高
int32_t?code?=?SET_BUFFER_GEOMETRY;
int32_t?width?= 0x100;
int32_t?height?= 0x100;
//?這里的nativeWindow是從上一步驟中的回調(diào)函數(shù)中獲得的
int32_t?ret?= OH_NativeWindow_NativeWindowHandleOpt(nativeWindow,?code,?width,?height);
3.? 從圖形隊(duì)列申請 OHNativeWindowBuffer。
OHNativeWindowBuffer*?buffer?= nullptr;
int?fenceFd;
//?通過?OH_NativeWindow_NativeWindowRequestBuffer?獲取?OHNativeWindowBuffer?實(shí)例
OH_NativeWindow_NativeWindowRequestBuffer(nativeWindow, &buffer, &fenceFd);
//?通過?OH_NativeWindow_GetBufferHandleFromNative?獲取?buffer?的?handle
BufferHandle*?bufferHandle?= OH_NativeWindow_GetBufferHandleFromNative(buffer);
4.? 內(nèi)存映射 mmap。
#include?<sys/mman.h>//?使用系統(tǒng)接口mmap將bufferHandle對應(yīng)的共享內(nèi)存映射到用戶空間,可以通過映射出來的虛擬地址向bufferHandle中寫入圖像數(shù)據(jù)
//?bufferHandle->virAddr是bufferHandle在共享內(nèi)存中的起始地址,bufferHandle->size是bufferHandle在共享內(nèi)存中的內(nèi)存占用大小
void*?mappedAddr?= mmap(bufferHandle->virAddr,?bufferHandle->size,?PROT_READ?|?PROT_WRITE,?MAP_SHARED,?bufferHandle->fd, 0);
if (mappedAddr?==?MAP_FAILED) {//?mmap?failed
}
5.? 將生產(chǎn)的內(nèi)容寫入 OHNativeWindowBuffer。
static uint32_t?value?= 0x00;
value++;
uint32_t *pixel?= static_cast<uint32_t?*>(mappedAddr); //?使用mmap獲取到的地址來訪問內(nèi)存
for (uint32_t?x?= 0;?x?<?width;?x++) {for (uint32_t?y?= 0;??y?<?height;?y++) {*pixel++ =?value;}
}
6.? 提交 OHNativeWindowBuffer 到圖形隊(duì)列。
//?設(shè)置刷新區(qū)域,如果Region中的Rect為nullptr,或者rectNumber為0,則認(rèn)為OHNativeWindowBuffer全部有內(nèi)容更改。
Region?region{nullptr, 0};
//?通過OH_NativeWindow_NativeWindowFlushBuffer?提交給消費(fèi)者使用,例如:顯示在屏幕上。
OH_NativeWindow_NativeWindowFlushBuffer(nativeWindow,?buffer,?fenceFd,?region);
7.? 取消內(nèi)存映射 munmap。
//?內(nèi)存使用完記得去掉內(nèi)存映射
int?result?= munmap(mappedAddr,?bufferHandle->size);
if (result?== -1) {
//?munmap?failed
}