diff --git a/OAT.xml b/OAT.xml index 582e32b42f0e523179994eeb5be84f083e602749..65d905c7bf2f969a5b99baa41b212124553b691e 100644 --- a/OAT.xml +++ b/OAT.xml @@ -514,6 +514,7 @@ Note:If the text contains special characters, please escape them according to th + diff --git a/code/BasicFeature/Native/NdkNativeWindow/README_zh.md b/code/BasicFeature/Native/NdkNativeWindow/README_zh.md index 294e72d284a30a949149f42e39587931de2dfbfa..fd41ec25213ec575d02a39bb7710e0fd22d29689 100644 --- a/code/BasicFeature/Native/NdkNativeWindow/README_zh.md +++ b/code/BasicFeature/Native/NdkNativeWindow/README_zh.md @@ -8,11 +8,13 @@ > 本示例XComponent接口使用方法已停止演进,推荐使用方法请参考[ArkTSXComponent示例](../ArkTSXComponent/README_zh.md)。 ### 效果预览 -| 主页 | 改变矩形框颜色 | 生产buffer | 获取可用帧回调次数 | -|----------------------------------------------|---------------------------------------------------|---------------------------------------------------|-----------------------------------------------------------| -| ![main](screenshots/device/Main.jpg) | ![Draw Path](screenshots/device/ChangeColor.jpg) | ![change color](screenshots/device/ProduceBuffer.jpg) | ![change color](screenshots/device/GetAvailableCount.jpg) | -| attachbuffer | detachbuffer | fit模式(手机) | 拉伸模式(手机) | -| ![main](screenshots/device/AttachBuffer.jpg) | ![Draw Path](screenshots/device/DetachBuffer.jpg) | ![Draw Path](screenshots/device/scalefit.jpg) | ![Draw Path](screenshots/device/scaledown.jpg) | +| 主页 | 改变矩形框颜色 | 生产buffer | 获取可用帧回调次数 | +|---------------------------------------------------|---------------------------------------------------|---------------------------------------------------|-----------------------------------------------------------| +| ![main](screenshots/device/Main.jpg) | ![Draw Path](screenshots/device/ChangeColor.jpg) | ![change color](screenshots/device/ProduceBuffer.jpg) | ![change color](screenshots/device/GetAvailableCount.jpg) | +| attachbuffer | detachbuffer | fit模式(手机) | 拉伸模式(手机) | +| ![main](screenshots/device/AttachBuffer.jpg) | ![Draw Path](screenshots/device/DetachBuffer.jpg) | ![Draw Path](screenshots/device/scalefit.jpg) | ![Draw Path](screenshots/device/scaledown.jpg) | +| clean cache | +| ![clean cache](screenshots/device/CleanCache.jpg) | 使用说明 @@ -25,6 +27,7 @@ 6. 点击页面底部”attachbuffer“, 在cachebuffer大于0时将buffer添加到nativewindow中,attachedbuffer数值加1,cachebuffer数值减1;cachebuffer为0时不做处理。(需要点第五步按钮更新数值) 7. 点击页面底部”detachbuffer", 在attachedbuffer大于0时将buffer添加到缓存区cachebuffer中,attachedbuffer数值减1,cachebuffer数值加1; attachedbuffer为0时不做处理。(需要点第五步按钮更新数值) 8. 点击页面顶部"Change ScalingMode"按钮,在支持fit模式的设备可以切换色块居中显示或平铺显示,开发板不支持fit模式。 +9. 点击页面底部“clean cache”按钮,将清理矩形框填充区域的NativeWindow缓存; ### 工程目录 @@ -60,30 +63,31 @@ 涉及到的相关接口: -| 接口名 | 描述 | -| -------- | -------- | -| OH_NativeWindow_CreateNativeWindow (void *pSurface) | 创建OHNativeWindow实例,每次调用都会产生一个新的OHNativeWindow实例 | -| OH_NativeWindow_DestroyNativeWindow (OHNativeWindow *window) | 将OHNativeWindow对象的引用计数减1,当引用计数为0的时候,该OHNativeWindow对象会被析构掉 | -| OH_NativeWindow_CreateNativeWindowBufferFromNativeBuffer (OH_NativeBuffer *nativeBuffer) | 创建OHNativeWindowBuffer实例,每次调用都会产生一个新的OHNativeWindowBuffer实例 | -| OH_NativeWindow_DestroyNativeWindowBuffer (OHNativeWindowBuffer *buffer) | 将OHNativeWindowBuffer对象的引用计数减1,当引用计数为0的时候,该OHNativeWindowBuffer对象会被析构掉 | -| OH_NativeWindow_NativeWindowRequestBuffer (OHNativeWindow *window, OHNativeWindowBuffer **buffer, int *fenceFd) | 通过OHNativeWindow对象申请一块OHNativeWindowBuffer,用以内容生产 | -| OH_NativeWindow_NativeWindowFlushBuffer (OHNativeWindow *window, OHNativeWindowBuffer *buffer, int fenceFd, Region region) | 通过OHNativeWindow将生产好内容的OHNativeWindowBuffer放回到Buffer队列中,用以内容消费 | -| OH_NativeWindow_GetLastFlushedBuffer (OHNativeWindow *window, OHNativeWindowBuffer **buffer) | 从OHNativeWindow获取上次送回到buffer队列中的OHNativeWindowBuffer | -| OH_NativeWindow_NativeWindowHandleOpt (OHNativeWindow *window, int code,...) | 设置/获取OHNativeWindow的属性,包括设置/获取宽高、内容格式等 | -| OH_NativeWindow_GetBufferHandleFromNative (OHNativeWindowBuffer *buffer) | 通过OHNativeWindowBuffer获取该buffer的BufferHandle指针 | -| OH_NativeBuffer_SetColorSpace (OH_NativeBuffer *buffer, OH_NativeBuffer_ColorSpace colorSpace) | 为OH_NativeBuffer设置颜色空间属性 | -| OH_NativeImage_SetOnFrameAvailableListener (OH_NativeImage *image, OH_OnFrameAvailableListener listener) | 设置帧可用回调 | -| OH_NativeImage_UnsetOnFrameAvailableListener (OH_NativeImage *image) | 取消设置帧可用回调 | +| 接口名 | 描述 | +| -------- |--------------------------------------------------------------------------------------------------------| +| OH_NativeWindow_CreateNativeWindow (void *pSurface) | 创建OHNativeWindow实例,每次调用都会产生一个新的OHNativeWindow实例 | +| OH_NativeWindow_DestroyNativeWindow (OHNativeWindow *window) | 将OHNativeWindow对象的引用计数减1,当引用计数为0的时候,该OHNativeWindow对象会被析构掉 | +| OH_NativeWindow_CreateNativeWindowBufferFromNativeBuffer (OH_NativeBuffer *nativeBuffer) | 创建OHNativeWindowBuffer实例,每次调用都会产生一个新的OHNativeWindowBuffer实例 | +| OH_NativeWindow_DestroyNativeWindowBuffer (OHNativeWindowBuffer *buffer) | 将OHNativeWindowBuffer对象的引用计数减1,当引用计数为0的时候,该OHNativeWindowBuffer对象会被析构掉 | +| OH_NativeWindow_NativeWindowRequestBuffer (OHNativeWindow *window, OHNativeWindowBuffer **buffer, int *fenceFd) | 通过OHNativeWindow对象申请一块OHNativeWindowBuffer,用以内容生产 | +| OH_NativeWindow_NativeWindowFlushBuffer (OHNativeWindow *window, OHNativeWindowBuffer *buffer, int fenceFd, Region region) | 通过OHNativeWindow将生产好内容的OHNativeWindowBuffer放回到Buffer队列中,用以内容消费 | +| OH_NativeWindow_GetLastFlushedBuffer (OHNativeWindow *window, OHNativeWindowBuffer **buffer) | 从OHNativeWindow获取上次送回到buffer队列中的OHNativeWindowBuffer | +| OH_NativeWindow_NativeWindowHandleOpt (OHNativeWindow *window, int code,...) | 设置/获取OHNativeWindow的属性,包括设置/获取宽高、内容格式等 | +| OH_NativeWindow_GetBufferHandleFromNative (OHNativeWindowBuffer *buffer) | 通过OHNativeWindowBuffer获取该buffer的BufferHandle指针 | +| OH_NativeBuffer_SetColorSpace (OH_NativeBuffer *buffer, OH_NativeBuffer_ColorSpace colorSpace) | 为OH_NativeBuffer设置颜色空间属性 | +| OH_NativeImage_SetOnFrameAvailableListener (OH_NativeImage *image, OH_OnFrameAvailableListener listener) | 设置帧可用回调 | +| OH_NativeImage_UnsetOnFrameAvailableListener (OH_NativeImage *image) | 取消设置帧可用回调 | | OH_NativeImage_AcquireNativeWindow (OH_NativeImage *image) | 获取与OH_NativeImage相关联的OHNativeWindow指针。 该OHNativeWindow后续不再需要时需要调用OH_NativeWindow_DestroyNativeWindow释放 | -| OH_NativeWindow_GetSurfaceId (OHNativeWindow *window, uint64_t *surfaceId) | 获取surfaceId | -| OH_NativeWindow_CreateNativeWindowFromSurfaceId (uint64_t surfaceId, OHNativeWindow **window) | 通过surfaceId获取对应的OHNativeWindow | -| OH_NativeBuffer_MapPlanes (OH_NativeBuffer *buffer, void **virAddr, OH_NativeBuffer_Planes *outPlanes) | 将OH_NativeBuffer对应的多通道ION内存映射到进程空间 | -| OH_NativeBuffer_FromNativeWindowBuffer (OHNativeWindowBuffer *nativeWindowBuffer, OH_NativeBuffer **buffer) | 将OHNativeWindowBuffer实例转换为OH_NativeBuffer实例 | -| OH_NativeWindow_NativeWindowAttachBuffer(OHNativeWindow *window, OHNativeWindowBuffer *buffer) | 将缓存区OHNativeWindowBuffer添加到OHNativeWindow中 | -| OH_NativeWindow_NativeWindowDetachBuffer(OHNativeWindow *window, OHNativeWindowBuffer *buffer) | 将OHNativeWindow中的buffer移除,放置到缓存区中 | -| OH_NativeWindow_WriteToParcel(OHNativeWindow* window, OHIPCParcel* parcel)| 向OHIPCParcel对象中写入一个OHNativeWindow对象| -| OH_NativeWindow_ReadFromParcel(OHIPCParcel *parcel, OHNativeWindow **window)| 从OHIPCParcel对象中读取一个OHNativeWindow对象| -| OH_NativeWindow_NativeWindowSetScalingModeV2(OHNativeWindow *window, OHScalingModeV2 scalingMode)| 为OHNativeWindow设置显示模式| +| OH_NativeWindow_GetSurfaceId (OHNativeWindow *window, uint64_t *surfaceId) | 获取surfaceId | +| OH_NativeWindow_CreateNativeWindowFromSurfaceId (uint64_t surfaceId, OHNativeWindow **window) | 通过surfaceId获取对应的OHNativeWindow | +| OH_NativeBuffer_MapPlanes (OH_NativeBuffer *buffer, void **virAddr, OH_NativeBuffer_Planes *outPlanes) | 将OH_NativeBuffer对应的多通道ION内存映射到进程空间 | +| OH_NativeBuffer_FromNativeWindowBuffer (OHNativeWindowBuffer *nativeWindowBuffer, OH_NativeBuffer **buffer) | 将OHNativeWindowBuffer实例转换为OH_NativeBuffer实例 | +| OH_NativeWindow_NativeWindowAttachBuffer(OHNativeWindow *window, OHNativeWindowBuffer *buffer) | 将缓存区OHNativeWindowBuffer添加到OHNativeWindow中 | +| OH_NativeWindow_NativeWindowDetachBuffer(OHNativeWindow *window, OHNativeWindowBuffer *buffer) | 将OHNativeWindow中的buffer移除,放置到缓存区中 | +| OH_NativeWindow_WriteToParcel(OHNativeWindow* window, OHIPCParcel* parcel)| 向OHIPCParcel对象中写入一个OHNativeWindow对象 | +| OH_NativeWindow_ReadFromParcel(OHIPCParcel *parcel, OHNativeWindow **window)| 从OHIPCParcel对象中读取一个OHNativeWindow对象 | +| OH_NativeWindow_NativeWindowSetScalingModeV2(OHNativeWindow *window, OHScalingModeV2 scalingMode)| 为OHNativeWindow设置显示模式 | +| OH_NativeWindow_CleanCache(OHNativeWindow *window)| 为OHNativeWindow清理buffer缓存 | 详细的接口说明请参考[NativeWindow](https://docs.openharmony.cn/pages/v4.1/zh-cn/application-dev/reference/apis-arkgraphics2d/_o_h___native_image.md),[NativeImage](https://docs.openharmony.cn/pages/v4.1/zh-cn/application-dev/reference/apis-arkgraphics2d/_o_h___native_image.md),[NativeBuffer](https://docs.openharmony.cn/pages/v4.0/zh-cn/application-dev/reference/native-apis/_o_h___native_buffer.md)。 @@ -98,8 +102,8 @@ XComponent NativeWindow NativeImage EGL。 ### 约束与限制 1. 本示例仅支持标准系统上运行; -2. 本示例为Stage模型,已适配API version 12版本SDK,SDK版本号5.0.0.19及以上版本,镜像版本号支持5.0.0.19及以上版本; -3. 本示例需要使用DevEco Studio 4.0 Beta2 版本号(4.1.3.400)及以上版本才可编译运行。 +2. 本示例为Stage模型,已适配API version 18版本SDK,SDK版本号5.1.0.54及以上版本,镜像版本号支持5.1.0.54及以上版本; +3. 本示例需要使用DevEco Studio 5.0.2 Release 版本号(5.0.7.210)及以上版本才可编译运行。 ### 下载 如需单独下载本工程,执行如下命令: diff --git a/code/BasicFeature/Native/NdkNativeWindow/build-profile.json5 b/code/BasicFeature/Native/NdkNativeWindow/build-profile.json5 index 4a6f21f792fc0fc64f738d032513190c239af6c7..b151a5bec5e34f8521264969f864606399ce1668 100644 --- a/code/BasicFeature/Native/NdkNativeWindow/build-profile.json5 +++ b/code/BasicFeature/Native/NdkNativeWindow/build-profile.json5 @@ -20,8 +20,8 @@ { "name": "default", "signingConfig": "default", - "compileSdkVersion": 14, - "compatibleSdkVersion": 14, + "compileSdkVersion": 18, + "compatibleSdkVersion": 18, "runtimeOS": "OpenHarmony", } ] diff --git a/code/BasicFeature/Native/NdkNativeWindow/entry/src/main/cpp/NativeRender.cpp b/code/BasicFeature/Native/NdkNativeWindow/entry/src/main/cpp/NativeRender.cpp index f69d9178a515ff867469d2b9179322596880556b..1ae99208154f467c8c5a09253b1bb4ec05cc26d1 100644 --- a/code/BasicFeature/Native/NdkNativeWindow/entry/src/main/cpp/NativeRender.cpp +++ b/code/BasicFeature/Native/NdkNativeWindow/entry/src/main/cpp/NativeRender.cpp @@ -91,6 +91,7 @@ bool NativeRender::Export(napi_env env, napi_value exports) napi_property_descriptor desc[] = { { "DrawColor", nullptr, NativeRender::NapiOnDraw, nullptr, nullptr, nullptr, napi_default, nullptr }, + { "CleanCache", nullptr, NativeRender::NapiOnCleanCache, nullptr, nullptr, nullptr, napi_default, nullptr }, { "ChangeScalingMode", nullptr, NativeRender::NapiOnChangeScalingMode, nullptr, nullptr, nullptr, napi_default, nullptr }, }; @@ -140,6 +141,12 @@ napi_value NativeRender::NapiOnDraw(napi_env env, napi_callback_info info) return nullptr; } +napi_value NativeRender::NapiOnCleanCache(napi_env env, napi_callback_info info) +{ + NativeRender::GetInstance()->CleanCache(); + return nullptr; +} + napi_value NativeRender::NapiOnChangeScalingMode(napi_env env, napi_callback_info info) { NativeRender::GetInstance()->ChangeScalingMode(); @@ -260,6 +267,11 @@ void NativeRender::ChangeColor() DrawBaseColor(); } +void NativeRender::CleanCache() +{ + OH_NativeWindow_CleanCache(nativeWindow_); +} + void NativeRender::ChangeScalingMode() { flagFit_ = !flagFit_; diff --git a/code/BasicFeature/Native/NdkNativeWindow/entry/src/main/cpp/NativeRender.h b/code/BasicFeature/Native/NdkNativeWindow/entry/src/main/cpp/NativeRender.h index 25ddd46640d22a94e02b2fa04d93214c5171bccb..7f6b454e12e1f70c139f722d2f0539bdf8d36452 100644 --- a/code/BasicFeature/Native/NdkNativeWindow/entry/src/main/cpp/NativeRender.h +++ b/code/BasicFeature/Native/NdkNativeWindow/entry/src/main/cpp/NativeRender.h @@ -28,12 +28,14 @@ public: static napi_value GetNativeRender(napi_env env, napi_callback_info info); static napi_value NapiOnDraw(napi_env env, napi_callback_info info); static napi_value NapiOnChangeScalingMode(napi_env env, napi_callback_info info); + static napi_value NapiOnCleanCache(napi_env env, napi_callback_info info); static void Release(); bool Export(napi_env env, napi_value exports); void DrawBaseColor(); void ChangeColor(); void ChangeScalingMode(); void SetNativeWindow(OHNativeWindow* nativeWindow, uint64_t width, uint64_t height); + void CleanCache(); private: void NativeBufferApi(); diff --git a/code/BasicFeature/Native/NdkNativeWindow/entry/src/main/ets/interface/NativeWindowContext.ts b/code/BasicFeature/Native/NdkNativeWindow/entry/src/main/ets/interface/NativeWindowContext.ts index 7a1dfe24b8f3d8a1f6acf8cf7c804973ef13a2ef..59b96cd5da035c7a4597a89be260421f27dc5d12 100644 --- a/code/BasicFeature/Native/NdkNativeWindow/entry/src/main/ets/interface/NativeWindowContext.ts +++ b/code/BasicFeature/Native/NdkNativeWindow/entry/src/main/ets/interface/NativeWindowContext.ts @@ -39,4 +39,5 @@ export default interface NativeWindowContext { GetBufferQueueSize(): number; GetAttachBufferCount(): number; GetCacheBufferCount(): number; + CleanCache(): number; }; diff --git a/code/BasicFeature/Native/NdkNativeWindow/entry/src/main/ets/pages/Index.ets b/code/BasicFeature/Native/NdkNativeWindow/entry/src/main/ets/pages/Index.ets index ff69360f918b713f0d3a3ea141aa2f19c6572881..ebf3ad2e935e0fc3df0965d954737fcc7d06d4fc 100644 --- a/code/BasicFeature/Native/NdkNativeWindow/entry/src/main/ets/pages/Index.ets +++ b/code/BasicFeature/Native/NdkNativeWindow/entry/src/main/ets/pages/Index.ets @@ -158,16 +158,28 @@ struct Index { } }) .height(60) - Button(`attach buffer`) - .fontSize('14fp') - .fontWeight(500) - .margin({ bottom: 24 }) - .onClick(() => { - if (this.nativeWindowContext) { - this.nativeWindowContext.AttachBuffer(); - } - }) - .height(40) + Row() { + Button(`attach buffer`) + .fontSize('14fp') + .fontWeight(500) + .margin({ bottom: 24 }) + .onClick(() => { + if (this.nativeWindowContext) { + this.nativeWindowContext.AttachBuffer(); + } + }) + .height(40) + Button(`clean cache`) + .fontSize('14fp') + .fontWeight(500) + .margin({ bottom: 24 }) + .onClick(() => { + if (this.nativeWindowContext) { + this.nativeWindowContext.CleanCache(); + } + }) + .height(40) + } Button(`dettach buffer`) .fontSize('14fp') .fontWeight(500) diff --git a/code/BasicFeature/Native/NdkNativeWindow/screenshots/device/CleanCache.jpg b/code/BasicFeature/Native/NdkNativeWindow/screenshots/device/CleanCache.jpg new file mode 100644 index 0000000000000000000000000000000000000000..8b7787713209b83de920ca2f469ab66567ee7209 Binary files /dev/null and b/code/BasicFeature/Native/NdkNativeWindow/screenshots/device/CleanCache.jpg differ