From e689bc44f74c5c3c8b0892a6873f71574fadd186 Mon Sep 17 00:00:00 2001 From: zjsxstar Date: Sat, 28 Jun 2025 18:56:44 +0800 Subject: [PATCH] =?UTF-8?q?=E6=96=B0=E5=A2=9ENativeXComponent=20demo,=20?= =?UTF-8?q?=E8=A1=A5=E5=85=85=E4=BD=BF=E7=94=A8OH=5FArkUI=5FSurfaceHolder?= =?UTF-8?q?=E7=AE=A1=E7=90=86surface=E7=94=9F=E5=91=BD=E5=91=A8=E6=9C=9F?= =?UTF-8?q?=E7=9A=84=E5=9C=BA=E6=99=AF=E7=A4=BA=E4=BE=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: zjsxstar --- OAT.xml | 6 + .../Native/NativeXComponent/.gitignore | 12 + .../NativeXComponent/AppScope/app.json5 | 10 + .../resources/base/element/string.json | 8 + .../resources/base/media/app_icon.png | Bin 0 -> 2777 bytes .../Native/NativeXComponent/README_zh.md | 111 +++++++ .../NativeXComponent/build-profile.json5 | 49 +++ .../Native/NativeXComponent/entry/.gitignore | 6 + .../entry/build-profile.json5 | 40 +++ .../NativeXComponent/entry/hvigorfile.ts | 6 + .../NativeXComponent/entry/oh-package.json5 | 11 + .../entry/src/main/cpp/CMakeLists.txt | 67 ++++ .../src/main/cpp/manager/plugin_manager.cpp | 194 +++++++++++ .../src/main/cpp/manager/plugin_manager.h | 47 +++ .../entry/src/main/cpp/napi_init.cpp | 56 ++++ .../entry/src/main/cpp/render/EGLConst.h | 137 ++++++++ .../entry/src/main/cpp/render/EGLRender.cpp | 302 ++++++++++++++++++ .../entry/src/main/cpp/render/EGLRender.h | 48 +++ .../main/cpp/types/libnativerender/Index.d.ts | 18 ++ .../types/libnativerender/oh-package.json5 | 21 ++ .../main/ets/entryability/EntryAbility.ets | 56 ++++ .../entrybackupability/EntryBackupAbility.ets | 27 ++ .../entry/src/main/ets/pages/Index.ets | 123 +++++++ .../entry/src/main/module.json5 | 51 +++ .../main/resources/base/element/color.json | 8 + .../main/resources/base/element/string.json | 16 + .../main/resources/base/media/background.png | Bin 0 -> 57364 bytes .../main/resources/base/media/foreground.png | Bin 0 -> 12430 bytes .../resources/base/media/layered_image.json | 7 + .../main/resources/base/media/startIcon.png | Bin 0 -> 20093 bytes .../resources/base/profile/backup_config.json | 3 + .../resources/base/profile/main_pages.json | 5 + .../main/resources/en_US/element/string.json | 16 + .../main/resources/zh_CN/element/string.json | 16 + .../entry/src/mock/Libentry.mock.ets | 7 + .../entry/src/mock/mock-config.json5 | 5 + .../src/ohosTest/ets/test/Ability.test.ets | 229 +++++++++++++ .../entry/src/ohosTest/ets/test/List.test.ets | 5 + .../entry/src/ohosTest/module.json5 | 12 + .../entry/src/test/List.test.ets | 5 + .../entry/src/test/LocalUnit.test.ets | 33 ++ .../hvigor/hvigor-config.json5 | 22 ++ .../Native/NativeXComponent/hvigorfile.ts | 6 + .../Native/NativeXComponent/oh-package.json5 | 10 + .../screenshots/device/changeColor.jpeg | Bin 0 -> 54161 bytes .../screenshots/device/drawStar.jpeg | Bin 0 -> 55148 bytes 46 files changed, 1811 insertions(+) create mode 100644 code/BasicFeature/Native/NativeXComponent/.gitignore create mode 100644 code/BasicFeature/Native/NativeXComponent/AppScope/app.json5 create mode 100644 code/BasicFeature/Native/NativeXComponent/AppScope/resources/base/element/string.json create mode 100644 code/BasicFeature/Native/NativeXComponent/AppScope/resources/base/media/app_icon.png create mode 100644 code/BasicFeature/Native/NativeXComponent/README_zh.md create mode 100644 code/BasicFeature/Native/NativeXComponent/build-profile.json5 create mode 100644 code/BasicFeature/Native/NativeXComponent/entry/.gitignore create mode 100644 code/BasicFeature/Native/NativeXComponent/entry/build-profile.json5 create mode 100644 code/BasicFeature/Native/NativeXComponent/entry/hvigorfile.ts create mode 100644 code/BasicFeature/Native/NativeXComponent/entry/oh-package.json5 create mode 100644 code/BasicFeature/Native/NativeXComponent/entry/src/main/cpp/CMakeLists.txt create mode 100644 code/BasicFeature/Native/NativeXComponent/entry/src/main/cpp/manager/plugin_manager.cpp create mode 100644 code/BasicFeature/Native/NativeXComponent/entry/src/main/cpp/manager/plugin_manager.h create mode 100644 code/BasicFeature/Native/NativeXComponent/entry/src/main/cpp/napi_init.cpp create mode 100644 code/BasicFeature/Native/NativeXComponent/entry/src/main/cpp/render/EGLConst.h create mode 100644 code/BasicFeature/Native/NativeXComponent/entry/src/main/cpp/render/EGLRender.cpp create mode 100644 code/BasicFeature/Native/NativeXComponent/entry/src/main/cpp/render/EGLRender.h create mode 100644 code/BasicFeature/Native/NativeXComponent/entry/src/main/cpp/types/libnativerender/Index.d.ts create mode 100644 code/BasicFeature/Native/NativeXComponent/entry/src/main/cpp/types/libnativerender/oh-package.json5 create mode 100644 code/BasicFeature/Native/NativeXComponent/entry/src/main/ets/entryability/EntryAbility.ets create mode 100644 code/BasicFeature/Native/NativeXComponent/entry/src/main/ets/entrybackupability/EntryBackupAbility.ets create mode 100644 code/BasicFeature/Native/NativeXComponent/entry/src/main/ets/pages/Index.ets create mode 100644 code/BasicFeature/Native/NativeXComponent/entry/src/main/module.json5 create mode 100644 code/BasicFeature/Native/NativeXComponent/entry/src/main/resources/base/element/color.json create mode 100644 code/BasicFeature/Native/NativeXComponent/entry/src/main/resources/base/element/string.json create mode 100644 code/BasicFeature/Native/NativeXComponent/entry/src/main/resources/base/media/background.png create mode 100644 code/BasicFeature/Native/NativeXComponent/entry/src/main/resources/base/media/foreground.png create mode 100644 code/BasicFeature/Native/NativeXComponent/entry/src/main/resources/base/media/layered_image.json create mode 100644 code/BasicFeature/Native/NativeXComponent/entry/src/main/resources/base/media/startIcon.png create mode 100644 code/BasicFeature/Native/NativeXComponent/entry/src/main/resources/base/profile/backup_config.json create mode 100644 code/BasicFeature/Native/NativeXComponent/entry/src/main/resources/base/profile/main_pages.json create mode 100644 code/BasicFeature/Native/NativeXComponent/entry/src/main/resources/en_US/element/string.json create mode 100644 code/BasicFeature/Native/NativeXComponent/entry/src/main/resources/zh_CN/element/string.json create mode 100644 code/BasicFeature/Native/NativeXComponent/entry/src/mock/Libentry.mock.ets create mode 100644 code/BasicFeature/Native/NativeXComponent/entry/src/mock/mock-config.json5 create mode 100644 code/BasicFeature/Native/NativeXComponent/entry/src/ohosTest/ets/test/Ability.test.ets create mode 100644 code/BasicFeature/Native/NativeXComponent/entry/src/ohosTest/ets/test/List.test.ets create mode 100644 code/BasicFeature/Native/NativeXComponent/entry/src/ohosTest/module.json5 create mode 100644 code/BasicFeature/Native/NativeXComponent/entry/src/test/List.test.ets create mode 100644 code/BasicFeature/Native/NativeXComponent/entry/src/test/LocalUnit.test.ets create mode 100644 code/BasicFeature/Native/NativeXComponent/hvigor/hvigor-config.json5 create mode 100644 code/BasicFeature/Native/NativeXComponent/hvigorfile.ts create mode 100644 code/BasicFeature/Native/NativeXComponent/oh-package.json5 create mode 100644 code/BasicFeature/Native/NativeXComponent/screenshots/device/changeColor.jpeg create mode 100644 code/BasicFeature/Native/NativeXComponent/screenshots/device/drawStar.jpeg diff --git a/OAT.xml b/OAT.xml index 8c9842e9ed..896fc38a47 100644 --- a/OAT.xml +++ b/OAT.xml @@ -189,6 +189,12 @@ Note:If the text contains special characters, please escape them according to th + + + + + + diff --git a/code/BasicFeature/Native/NativeXComponent/.gitignore b/code/BasicFeature/Native/NativeXComponent/.gitignore new file mode 100644 index 0000000000..d2ff20141c --- /dev/null +++ b/code/BasicFeature/Native/NativeXComponent/.gitignore @@ -0,0 +1,12 @@ +/node_modules +/oh_modules +/local.properties +/.idea +**/build +/.hvigor +.cxx +/.clangd +/.clang-format +/.clang-tidy +**/.test +/.appanalyzer \ No newline at end of file diff --git a/code/BasicFeature/Native/NativeXComponent/AppScope/app.json5 b/code/BasicFeature/Native/NativeXComponent/AppScope/app.json5 new file mode 100644 index 0000000000..33e40e31af --- /dev/null +++ b/code/BasicFeature/Native/NativeXComponent/AppScope/app.json5 @@ -0,0 +1,10 @@ +{ + "app": { + "bundleName": "com.example.nativexcomponent", + "vendor": "example", + "versionCode": 1000000, + "versionName": "1.0.0", + "icon": "$media:app_icon", + "label": "$string:app_name" + } +} diff --git a/code/BasicFeature/Native/NativeXComponent/AppScope/resources/base/element/string.json b/code/BasicFeature/Native/NativeXComponent/AppScope/resources/base/element/string.json new file mode 100644 index 0000000000..79421a57da --- /dev/null +++ b/code/BasicFeature/Native/NativeXComponent/AppScope/resources/base/element/string.json @@ -0,0 +1,8 @@ +{ + "string": [ + { + "name": "app_name", + "value": "NativeXComponent" + } + ] +} diff --git a/code/BasicFeature/Native/NativeXComponent/AppScope/resources/base/media/app_icon.png b/code/BasicFeature/Native/NativeXComponent/AppScope/resources/base/media/app_icon.png new file mode 100644 index 0000000000000000000000000000000000000000..a39445dc87828b76fed6d2ec470dd455c45319e3 GIT binary patch literal 2777 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 literal 0 HcmV?d00001 diff --git a/code/BasicFeature/Native/NativeXComponent/README_zh.md b/code/BasicFeature/Native/NativeXComponent/README_zh.md new file mode 100644 index 0000000000..521314df5f --- /dev/null +++ b/code/BasicFeature/Native/NativeXComponent/README_zh.md @@ -0,0 +1,111 @@ +# XComponent + +### 介绍 + +本示例主要介绍开发者如何使用ArkUI NDK API创建XComponent组件进行自定义绘制。主要包括:创建组件,获取ArkUI_NodeHandle和OH_ArkUI_SurfaceHolder实例,注册Surface生命周期和无障碍回调,设置可变帧率,获取NativeWindow后使用OpenGL ES/EGL接口在XComponent组件上进行图形绘制。功能主要包括绘制一个五角星,期望帧率设置,点击按钮开启/关闭软键盘,并可以通过点击XComponent区域改变五角星的颜色。 + +### 效果预览 + +| 绘制五角星 | 改变颜色 | +|-----------------------------------------------|-----------------------------------------------------| +| ![draw star](screenshots/device/drawStar.jpeg) | ![change color](screenshots/device/changeColor.jpeg) | + +使用说明 + +1. 安装编译生成的hap包,并打开应用。 +3. 点击XComponent组件区域(页面中蓝色五角星所在区域)改变五角星颜色。 +3. 点击“单指点击XComponent软键盘消失”对应区域,软键盘拉起;点击XComponent组件区域,软键盘消失。 +4. 点击needSoftKeyboard=false 按钮,点击“单指点击XComponent软键盘消失”对应区域,软键盘拉起;点击XComponent组件区域,软键盘不消失。 +5. 拖动期望帧率设置下的滑动条,可以控制期望帧率,具体通过打印日志的速度来衡量,日志检索"OnFrameCallback count"关键字。 + + +### 工程目录 + +``` +├──entry/src/main +│ ├──cpp // C++代码区 +│ │ ├──CMakeLists.txt // CMake配置文件 +│ │ ├──napi_init.cpp // Napi模块注册 +│ │ ├──manager // 生命周期管理模块 +│ │ │ ├──plugin_manager.cpp +│ │ │ └──plugin_manager.h +│ │ ├──render // 渲染模块 +│ │ │ ├──EGLConst.h +│ │ │ ├──EGLRender.cpp +│ │ │ └──EGLRender.h +| | ├──types +| | | ├──libnativerender +| | | | ├──Index.d.ts +| | | | ├──oh-package.json5 +│ ├──ets // ets代码区 +│ │ ├──entryability +│ │ │ ├──EntryAbility.ts // 程序入口类 +| | ├──entrybackupability +| | | ├──EntryBackupAbility.ets +│ │ ├──pages // 页面文件 +│ │ ├──Index.ets // 主界面 +| ├──resources // 资源文件目录 +``` + +### 具体实现 + +通过在IDE中创建Native c++ 工程,在c++代码中定义对外接口为BindNode,在ArkTS侧调用该接口用于注册Surface生命周期、事件和无障碍等回调,在回调逻辑中实现绘制五角星的逻辑。 + +基于OH_ArkUI_SurfaceHolder实例,在Native侧调用OH_ArkUI_XComponent_GetNativeWindow创建NativeWindow实例并初始化 +EGL环境。在Native侧的OnsurfaceChanged回调中,传入OH_ArkUI_SurfaceHolder、宽和高,并以此为输入调用EGL相关的接口改变对应NativeWindow的尺寸和内容。 + +源码参考:[main目录](entry/src/main/)下的文件。涉及到的相关接口: + +| 接口名 | 描述 | +| ------------------------------------------------------------ | ------------------------------------------------------------ | +| OH_ArkUI_QueryModuleInterfaceByName(ArkUI_NativeAPIVariantKind type, const char* structName) | 获取指定类型的Native模块接口集合。 | +| OH_ArkUI_XComponent_GetNativeWindow(OH_ArkUI_SurfaceHolder* surfaceHolder) | 获取与OH_ArkUI_SurfaceHolder实例关联的nativeWindow。 | +| OH_ArkUI_SurfaceHolder_RemoveSurfaceCallback(OH_ArkUI_SurfaceHolder* surfaceHolder, OH_ArkUI_SurfaceCallback* callback) | 从OH_ArkUI_SurfaceHolder实例中移除先前添加的Surface生命周期回调。 | +| OH_ArkUI_SurfaceCallback_Dispose(OH_ArkUI_SurfaceCallback* callback) | 释放OH_ArkUI_SurfaceCallback对象。 | +| OH_ArkUI_SurfaceHolder_Dispose(OH_ArkUI_SurfaceHolder* surfaceHolder) | 释放OH_ArkUI_SurfaceHolder对象。 | +| OH_ArkUI_NodeEvent_GetEventType(ArkUI_NodeEvent* event) | 从组件事件获取事件类型。 | +| OH_ArkUI_NodeEvent_GetNodeHandle(ArkUI_NodeEvent* event) | 获取触发组件事件的组件对象。 | +| OH_ArkUI_GetNodeHandleFromNapiValue(napi_env env, napi_value frameNode, ArkUI_NodeHandle* handle) | 获取ArkTS侧创建的FrameNode节点对象映射到native侧的ArkUI_NodeHandle。 | +| OH_ArkUI_SurfaceHolder_Create(ArkUI_NodeHandle node) | 从XComponent节点创建一个OH_ArkUI_SurfaceHolder对象。 | +| OH_ArkUI_SurfaceCallback_Create() | 创建一个OH_ArkUI_SurfaceCallback对象。 | +| OH_ArkUI_SurfaceCallback_SetSurfaceCreatedEvent(OH_ArkUI_SurfaceCallback* callback, void (\*onSurfaceCreated)(OH_ArkUI_SurfaceHolder* surfaceHolder)) | 往OH_ArkUI_SurfaceCallback对象中注册onSurfaceCreated回调。 | +| OH_ArkUI_SurfaceCallback_SetSurfaceChangedEvent(OH_ArkUI_SurfaceCallback* callback, void (\*onSurfaceChanged)(OH_ArkUI_SurfaceHolder* surfaceHolder, uint64_t width, uint64_t height)) | 往OH_ArkUI_SurfaceCallback对象中注册onSurfaceChanged回调。 | +| OH_ArkUI_SurfaceCallback_SetSurfaceDestroyedEvent(OH_ArkUI_SurfaceCallback* callback, void (\*onSurfaceDestroyed)(OH_ArkUI_SurfaceHolder* surfaceHolder)) | 往OH_ArkUI_SurfaceCallback对象中注册onSurfaceDestroyed回调。 | +| OH_ArkUI_SurfaceCallback_SetSurfaceShowEvent(OH_ArkUI_SurfaceCallback* callback, void (\*onSurfaceShow)(OH_ArkUI_SurfaceHolder* surfaceHolder)) | 往OH_ArkUI_SurfaceCallback对象中注册onSurfaceShow回调。 | +| OH_ArkUI_SurfaceCallback_SetSurfaceHideEvent(OH_ArkUI_SurfaceCallback* callback, void (\*onSurfaceHide)(OH_ArkUI_SurfaceHolder* surfaceHolder)) | 往OH_ArkUI_SurfaceCallback对象中注册onSurfaceHide回调。 | +| OH_ArkUI_XComponent_RegisterOnFrameCallback(ArkUI_NodeHandle node, void (*callback)(ArkUI_NodeHandle node, uint64_t timestamp, uint64_t targetTimestamp)) | 为XComponent节点注册onFrame回调。 | +| OH_ArkUI_SurfaceHolder_AddSurfaceCallback(OH_ArkUI_SurfaceHolder* surfaceHolder, OH_ArkUI_SurfaceCallback* callback) | 往OH_ArkUI_SurfaceHolder实例注册OH_ArkUI_SurfaceCallback对象。 | +| OH_ArkUI_AccessibilityProvider_Create(ArkUI_NodeHandle node) | 从XComponent节点创建一个ArkUI_AccessibilityProvider对象。 | +| OH_ArkUI_XComponent_UnregisterOnFrameCallback(ArkUI_NodeHandle node) | 取消注册XComponent节点的onFrame回调。 | +| OH_ArkUI_AccessibilityProvider_Dispose(ArkUI_AccessibilityProvider* provider) | 释放ArkUI_AccessibilityProvider对象。 | +| OH_ArkUI_XComponent_SetExpectedFrameRateRange(ArkUI_NodeHandle node, OH_NativeXComponent_ExpectedRateRange range) | 为XComponent节点设置预期的帧率范围。 | +| OH_ArkUI_XComponent_SetNeedSoftKeyboard(ArkUI_NodeHandle node, bool needSoftKeyboard) | 设置XComponent节点在获得焦点时是否需要显示软键盘。 | + + +### 相关权限 + +不涉及。 + +### 依赖 + +不涉及。 + +### 约束与限制 + +1. 本示例仅支持标准系统上运行,支持设备:rk3568 + +2. 本示例为Stage模型,支持API20版本SDK,SDK版本号(API Version 20 Release),镜像版本号(6.0 Release) + +3. 本示例需要使用DevEco Studio 版本号(6.0.0 Release)及以上版本才可编译运行 + +### 下载 + +如需单独下载本工程,执行如下命令: + +``` +git init +git config core.sparsecheckout true +echo code/BasicFeature/Native/NativeXComponent/ > .git/info/sparse-checkout +git remote add origin https://gitee.com/openharmony/applications_app_samples.git +git pull origin master +``` diff --git a/code/BasicFeature/Native/NativeXComponent/build-profile.json5 b/code/BasicFeature/Native/NativeXComponent/build-profile.json5 new file mode 100644 index 0000000000..4d722c4fd8 --- /dev/null +++ b/code/BasicFeature/Native/NativeXComponent/build-profile.json5 @@ -0,0 +1,49 @@ +{ + "app": { + "signingConfigs": [ + { + "name": "default", + "material": { + "certpath": "C:/Users/ygb/.ohos/config/openharmony/default_NativeXComponent_vettAfdtjXzJupm970gSS6vIj2Id7Ze2ciVtUQXR8Rg=.cer", + "storePassword": "0000001BEC892530464D6962B4D77B1E79E860C5875717DE664123F7D2E55BEC70B43186A43D9DD1956329", + "keyAlias": "debugKey", + "keyPassword": "0000001BE98DB5A9C0AF95C89DF9A44792F28CBCC21C552EABE1D78459C56AC35BB46E34BEED2E591E1202", + "profile": "C:/Users/ygb/.ohos/config/openharmony/default_NativeXComponent_vettAfdtjXzJupm970gSS6vIj2Id7Ze2ciVtUQXR8Rg=.p7b", + "signAlg": "SHA256withECDSA", + "storeFile": "C:/Users/ygb/.ohos/config/openharmony/default_NativeXComponent_vettAfdtjXzJupm970gSS6vIj2Id7Ze2ciVtUQXR8Rg=.p12" + } + } + ], + "products": [ + { + "name": "default", + "signingConfig": "default", + "compileSdkVersion": 12, + "compatibleSdkVersion": 12, + "runtimeOS": "OpenHarmony", + } + ], + "buildModeSet": [ + { + "name": "debug", + }, + { + "name": "release" + } + ] + }, + "modules": [ + { + "name": "entry", + "srcPath": "./entry", + "targets": [ + { + "name": "default", + "applyToProducts": [ + "default" + ] + } + ] + } + ] +} \ No newline at end of file diff --git a/code/BasicFeature/Native/NativeXComponent/entry/.gitignore b/code/BasicFeature/Native/NativeXComponent/entry/.gitignore new file mode 100644 index 0000000000..e2713a2779 --- /dev/null +++ b/code/BasicFeature/Native/NativeXComponent/entry/.gitignore @@ -0,0 +1,6 @@ +/node_modules +/oh_modules +/.preview +/build +/.cxx +/.test \ No newline at end of file diff --git a/code/BasicFeature/Native/NativeXComponent/entry/build-profile.json5 b/code/BasicFeature/Native/NativeXComponent/entry/build-profile.json5 new file mode 100644 index 0000000000..b57619b89a --- /dev/null +++ b/code/BasicFeature/Native/NativeXComponent/entry/build-profile.json5 @@ -0,0 +1,40 @@ +{ + "apiType": "stageMode", + "buildOption": { + "externalNativeOptions": { + "path": "./src/main/cpp/CMakeLists.txt", + "arguments": "", + "cppFlags": "", + "abiFilters": ["arm64-v8a", "armeabi-v7a", "x86_64"] + } + }, + "buildOptionSet": [ + { + "name": "release", + "arkOptions": { + "obfuscation": { + "ruleOptions": { + "enable": true, + "files": [ + "./obfuscation-rules.txt" + ] + } + } + }, + "nativeLib": { + "debugSymbol": { + "strip": true, + "exclude": [] + } + } + }, + ], + "targets": [ + { + "name": "default" + }, + { + "name": "ohosTest", + } + ] +} \ No newline at end of file diff --git a/code/BasicFeature/Native/NativeXComponent/entry/hvigorfile.ts b/code/BasicFeature/Native/NativeXComponent/entry/hvigorfile.ts new file mode 100644 index 0000000000..c6edcd9048 --- /dev/null +++ b/code/BasicFeature/Native/NativeXComponent/entry/hvigorfile.ts @@ -0,0 +1,6 @@ +import { hapTasks } from '@ohos/hvigor-ohos-plugin'; + +export default { + system: hapTasks, /* Built-in plugin of Hvigor. It cannot be modified. */ + plugins:[] /* Custom plugin to extend the functionality of Hvigor. */ +} diff --git a/code/BasicFeature/Native/NativeXComponent/entry/oh-package.json5 b/code/BasicFeature/Native/NativeXComponent/entry/oh-package.json5 new file mode 100644 index 0000000000..811a0b10e0 --- /dev/null +++ b/code/BasicFeature/Native/NativeXComponent/entry/oh-package.json5 @@ -0,0 +1,11 @@ +{ + "name": "entry", + "version": "1.0.0", + "description": "Please describe the basic information.", + "main": "", + "author": "", + "license": "", + "dependencies": { + "libnativerender.so": "file:./src/main/cpp/types/libnativerender" + } +} \ No newline at end of file diff --git a/code/BasicFeature/Native/NativeXComponent/entry/src/main/cpp/CMakeLists.txt b/code/BasicFeature/Native/NativeXComponent/entry/src/main/cpp/CMakeLists.txt new file mode 100644 index 0000000000..382141fc2d --- /dev/null +++ b/code/BasicFeature/Native/NativeXComponent/entry/src/main/cpp/CMakeLists.txt @@ -0,0 +1,67 @@ +# the minimum version of CMake. +cmake_minimum_required(VERSION 3.5.0) +project(LCNXComponent2) + +set(NATIVERENDER_ROOT_PATH ${CMAKE_CURRENT_SOURCE_DIR}) + +if(DEFINED PACKAGE_FIND_FILE) + include(${PACKAGE_FIND_FILE}) +endif() + +include_directories(${NATIVERENDER_ROOT_PATH} + ${NATIVERENDER_ROOT_PATH}/render + ${NATIVERENDER_ROOT_PATH}/manager) + +add_library(nativerender SHARED + render/EGLRender.cpp + manager/plugin_manager.cpp + napi_init.cpp) +find_library( + # Sets the name of the path variable. + EGL-lib + # Specifies the name of the NDK library that + # you want CMake to locate. + EGL +) + +find_library( + # Sets the name of the path variable. + GLES-lib + # Specifies the name of the NDK library that + # you want CMake to locate. + GLESv3 +) + +find_library( + # Sets the name of the path variable. + hilog-lib + # Specifies the name of the NDK library that + # you want CMake to locate. + hilog_ndk.z +) + +find_library( + # Sets the name of the path variable. + libace-lib + # Specifies the name of the NDK library that + # you want CMake to locate. + ace_ndk.z +) + +find_library( + # Sets the name of the path variable. + libnapi-lib + # Specifies the name of the NDK library that + # you want CMake to locate. + ace_napi.z +) + +find_library( + # Sets the name of the path variable. + libuv-lib + # Specifies the name of the NDK library that + # you want CMake to locate. + uv +) + +target_link_libraries(nativerender PUBLIC ${EGL-lib} ${GLES-lib} ${hilog-lib} ${libace-lib} ${libnapi-lib} ${libuv-lib} libnative_window.so) diff --git a/code/BasicFeature/Native/NativeXComponent/entry/src/main/cpp/manager/plugin_manager.cpp b/code/BasicFeature/Native/NativeXComponent/entry/src/main/cpp/manager/plugin_manager.cpp new file mode 100644 index 0000000000..ed521a4eb7 --- /dev/null +++ b/code/BasicFeature/Native/NativeXComponent/entry/src/main/cpp/manager/plugin_manager.cpp @@ -0,0 +1,194 @@ +/* + * Copyright (c) 2025 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +#include "plugin_manager.h" +#include +#include +#include +#include + +namespace NativeXComponentSample { +std::unordered_map PluginManager::nodeHandleMap_; +std::unordered_map PluginManager::renderMap_; +std::unordered_map PluginManager::callbackMap_; +std::unordered_map PluginManager::surfaceHolderMap_; +ArkUI_AccessibilityProvider *PluginManager::provider_ = nullptr; +ArkUI_NativeNodeAPI_1 *nodeAPI = reinterpret_cast( + OH_ArkUI_QueryModuleInterfaceByName(ARKUI_NATIVE_NODE, "ArkUI_NativeNodeAPI_1")); +namespace { +std::string value2String(napi_env env, napi_value value) // 将napi_value转化为string类型的变量 +{ + size_t stringSize = 0; + napi_get_value_string_utf8(env, value, nullptr, 0, &stringSize); + std::string valueString; + valueString.resize(stringSize); + napi_get_value_string_utf8(env, value, &valueString[0], stringSize + 1, &stringSize); + return valueString; +} + +void OnSurfaceCreated(OH_ArkUI_SurfaceHolder *holder) +{ + auto window = OH_ArkUI_XComponent_GetNativeWindow(holder); // 获取native window + auto render = new EGLRender(); + PluginManager::renderMap_[holder] = render; + render->SetUpEGLContext(window); +} + +void OnSurfaceChanged(OH_ArkUI_SurfaceHolder *holder, uint64_t width, uint64_t height) +{ + if (PluginManager::renderMap_.count(holder)) { + auto render = PluginManager::renderMap_[holder]; + render->SetEGLWindowSize(width, height); // 设置绘制区域大小 + render->DrawStar(true); // 绘制五角星 + } +} + +void OnSurfaceDestroyed(OH_ArkUI_SurfaceHolder *holder) +{ + OH_LOG_Print(LOG_APP, LOG_ERROR, 0xff00, "onBind", "on destroyed"); + if (PluginManager::renderMap_.count(holder)) { // 销毁render对象 + auto render = PluginManager::renderMap_[holder]; + delete render; + PluginManager::renderMap_.erase(holder); + } + if (PluginManager::callbackMap_.count(holder)) { + auto callback = PluginManager::callbackMap_[holder]; + OH_ArkUI_SurfaceHolder_RemoveSurfaceCallback(holder, callback); // 移除SurfaceCallback + OH_ArkUI_SurfaceCallback_Dispose(callback); // 销毁surfaceCallback + PluginManager::callbackMap_.erase(holder); + } + OH_ArkUI_SurfaceHolder_Dispose(holder); // 销毁surfaceHolder +} + +void OnSurfaceShow(OH_ArkUI_SurfaceHolder *holder) +{ + OH_LOG_Print(LOG_APP, LOG_ERROR, LOG_PRINT_DOMAIN, "onBind", "on surface show"); +} + +void OnSurfaceHide(OH_ArkUI_SurfaceHolder *holder) +{ + OH_LOG_Print(LOG_APP, LOG_ERROR, LOG_PRINT_DOMAIN, "onBind", "on surface hide"); +} + +void OnFrameCallback(ArkUI_NodeHandle node, uint64_t timestamp, uint64_t targetTimestamp) +{ + if (!PluginManager::surfaceHolderMap_.count(node)) { + return; + } + static uint64_t count = 0; + count++; + if (count % FRAME_COUNT == 0) { + OH_LOG_Print(LOG_APP, LOG_ERROR, LOG_PRINT_DOMAIN, "onBind", "OnFrameCallback count = %{public}ld", count); + } +} + +void onEvent(ArkUI_NodeEvent *event) +{ + auto eventType = OH_ArkUI_NodeEvent_GetEventType(event); // 获取组件事件类型 + OH_LOG_Print(LOG_APP, LOG_ERROR, LOG_PRINT_DOMAIN, "onBind", "on event"); + if (eventType == NODE_TOUCH_EVENT) { + ArkUI_NodeHandle handle = OH_ArkUI_NodeEvent_GetNodeHandle(event); // 获取触发该事件的组件对象 + auto holder = PluginManager::surfaceHolderMap_[handle]; + if (PluginManager::renderMap_.count(holder)) { + auto render = PluginManager::renderMap_[holder]; + render->DrawStar(false); // 绘制五角星 + } + OH_LOG_Print(LOG_APP, LOG_ERROR, LOG_PRINT_DOMAIN, "onBind", "on touch"); + } +} +} // namespace + +napi_value PluginManager::BindNode(napi_env env, napi_callback_info info) +{ + size_t argc = 2; + napi_value args[2] = {nullptr}; + napi_get_cb_info(env, info, &argc, args, nullptr, nullptr); + std::string nodeId = value2String(env, args[0]); + ArkUI_NodeHandle handle; + OH_ArkUI_GetNodeHandleFromNapiValue(env, args[1], &handle); // 获取 nodeHandle + OH_ArkUI_SurfaceHolder *holder = OH_ArkUI_SurfaceHolder_Create(handle); // 获取 SurfaceHolder + nodeHandleMap_[nodeId] = handle; + surfaceHolderMap_[handle] = holder; + auto callback = OH_ArkUI_SurfaceCallback_Create(); // 创建 SurfaceCallback + callbackMap_[holder] = callback; + OH_ArkUI_SurfaceCallback_SetSurfaceCreatedEvent(callback, OnSurfaceCreated); // 注册OnSurfaceCreated回调 + OH_ArkUI_SurfaceCallback_SetSurfaceChangedEvent(callback, OnSurfaceChanged); // 注册OnSurfaceChanged回调 + OH_ArkUI_SurfaceCallback_SetSurfaceDestroyedEvent(callback, OnSurfaceDestroyed); // 注册OnSurfaceDestroyed回调 + OH_ArkUI_SurfaceCallback_SetSurfaceShowEvent(callback, OnSurfaceShow); // 注册OnSurfaceShow回调 + OH_ArkUI_SurfaceCallback_SetSurfaceHideEvent(callback, OnSurfaceHide); // 注册OnSurfaceHide回调 + OH_ArkUI_XComponent_RegisterOnFrameCallback(handle, OnFrameCallback); // 注册OnFrameCallback回调 + OH_ArkUI_SurfaceHolder_AddSurfaceCallback(holder, callback); // 注册SurfaceCallback回调 + if (!nodeAPI->addNodeEventReceiver(handle, onEvent)) { // 添加事件监听,返回成功码 0 + OH_LOG_Print(LOG_APP, LOG_ERROR, LOG_PRINT_DOMAIN, "onBind", "addNodeEventReceiver error"); + } + if (!nodeAPI->registerNodeEvent(handle, NODE_TOUCH_EVENT, 0, nullptr)) { // 用C接口注册touch事件,返回成功码 0 + OH_LOG_Print(LOG_APP, LOG_ERROR, LOG_PRINT_DOMAIN, "onBind", "registerTouchEvent error"); + } + provider_ = OH_ArkUI_AccessibilityProvider_Create(handle); // 创建一个ArkUI_AccessibilityProvider类型的对象 + /** + * 获取ArkUI_AccessibilityProvider后,如果注册无障碍回调函数请参考: + * https://gitee.com/openharmony/docs/blob/OpenHarmony-5.1.0-Release/zh-cn/application-dev/ui/ndk-accessibility-xcomponent.md + * **/ + return nullptr; +} + +napi_value PluginManager::UnbindNode(napi_env env, napi_callback_info info) +{ + size_t argc = 1; + napi_value args[1] = {nullptr}; + napi_get_cb_info(env, info, &argc, args, nullptr, nullptr); + std::string nodeId = value2String(env, args[0]); + auto node = nodeHandleMap_[nodeId]; + OH_ArkUI_XComponent_UnregisterOnFrameCallback(node); // 解注册帧回调 + OH_ArkUI_AccessibilityProvider_Dispose(provider_); // 销毁 ArkUI_AccessibilityProvider + nodeAPI->disposeNode(node); // 销毁nodeHandle + nodeHandleMap_.erase(nodeId); + return nullptr; +} + +napi_value PluginManager::SetFrameRate(napi_env env, napi_callback_info info) +{ + size_t argc = 4; + napi_value args[4] = {nullptr}; + napi_get_cb_info(env, info, &argc, args, nullptr, nullptr); + std::string nodeId = value2String(env, args[0]); + auto node = nodeHandleMap_[nodeId]; + + int32_t min = 0; + napi_get_value_int32(env, args[FIRST_ARG], &min); + + int32_t max = 0; + napi_get_value_int32(env, args[SECOND_ARG], &max); + + int32_t expected = 0; + napi_get_value_int32(env, args[THIRD_ARG], &expected); + OH_NativeXComponent_ExpectedRateRange range = {.min = min, .max = max, .expected = expected}; + OH_ArkUI_XComponent_SetExpectedFrameRateRange(node, range); // 设置期望帧率 + return nullptr; +} + +napi_value PluginManager::SetNeedSoftKeyboard(napi_env env, napi_callback_info info) +{ + size_t argc = 2; + napi_value args[2] = {nullptr}; + napi_get_cb_info(env, info, &argc, args, nullptr, nullptr); + std::string nodeId = value2String(env, args[0]); + auto node = nodeHandleMap_[nodeId]; + + bool needSoftKeyboard = false; + napi_get_value_bool(env, args[1], &needSoftKeyboard); + OH_ArkUI_XComponent_SetNeedSoftKeyboard(node, needSoftKeyboard); // 设置是否需要软键盘 + return nullptr; +} +} // namespace NativeXComponentSample \ No newline at end of file diff --git a/code/BasicFeature/Native/NativeXComponent/entry/src/main/cpp/manager/plugin_manager.h b/code/BasicFeature/Native/NativeXComponent/entry/src/main/cpp/manager/plugin_manager.h new file mode 100644 index 0000000000..ac59f7b645 --- /dev/null +++ b/code/BasicFeature/Native/NativeXComponent/entry/src/main/cpp/manager/plugin_manager.h @@ -0,0 +1,47 @@ +/* + * Copyright (c) 2025 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef NATIVEXCOMPONENT_PLUGIN_MANAGER_H +#define NATIVEXCOMPONENT_PLUGIN_MANAGER_H + +#include "render/EGLRender.h" +#include +#include "napi/native_api.h" +#include +#include +#include + +namespace NativeXComponentSample { +constexpr const int FIRST_ARG = 1; +constexpr const int SECOND_ARG = 2; +constexpr const int THIRD_ARG = 3; +constexpr const int FRAME_COUNT = 50; +class PluginManager { +public: + ~PluginManager(); + static napi_value BindNode(napi_env env, napi_callback_info info); + static napi_value UnbindNode(napi_env env, napi_callback_info info); + static napi_value SetFrameRate(napi_env env, napi_callback_info info); + static napi_value SetNeedSoftKeyboard(napi_env env, napi_callback_info info); + +public: + static std::unordered_map nodeHandleMap_; + static std::unordered_map renderMap_; + static std::unordered_map callbackMap_; + static std::unordered_map surfaceHolderMap_; + static ArkUI_AccessibilityProvider *provider_; +}; +} // namespace NativeXComponentSample +#endif // NATIVEXCOMPONENT_PLUGIN_MANAGER_H diff --git a/code/BasicFeature/Native/NativeXComponent/entry/src/main/cpp/napi_init.cpp b/code/BasicFeature/Native/NativeXComponent/entry/src/main/cpp/napi_init.cpp new file mode 100644 index 0000000000..290c5c093d --- /dev/null +++ b/code/BasicFeature/Native/NativeXComponent/entry/src/main/cpp/napi_init.cpp @@ -0,0 +1,56 @@ +/* + * Copyright (c) 2025 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "manager/plugin_manager.h" + +namespace NativeXComponentSample { + +// 在napi_init.cpp文件中,Init方法注册接口函数,从而将封装的C++方法传递出来,供ArkTS侧调用 +EXTERN_C_START +static napi_value Init(napi_env env, napi_value exports) +{ + // 向ArkTS侧暴露接口 + napi_property_descriptor desc[] = { + {"bindNode", nullptr, PluginManager::BindNode, nullptr, nullptr, nullptr, napi_default, nullptr}, + {"unbindNode", nullptr, PluginManager::UnbindNode, nullptr, nullptr, nullptr, napi_default, nullptr}, + {"setFrameRate", nullptr, PluginManager::SetFrameRate, nullptr, nullptr, nullptr, napi_default, nullptr}, + {"setNeedSoftKeyboard", nullptr, PluginManager::SetNeedSoftKeyboard, nullptr, nullptr, nullptr, napi_default, + nullptr}, + }; + napi_define_properties(env, exports, sizeof(desc) / sizeof(desc[0]), desc); + return exports; +} +EXTERN_C_END + +// 编写接口的描述信息,根据实际需要可以修改对应参数 +static napi_module demoModule = { + .nm_version = 1, + .nm_flags = 0, + .nm_filename = nullptr, + // 入口函数 + .nm_register_func = Init, // 指定加载对应模块时的回调函数 + // 模块名称 + .nm_modname = + "nativerender", // 指定模块名称,对于XComponent相关开发,这个名称必须和ArkTS侧XComponent中libraryname的值保持一致 + .nm_priv = ((void *)0), + .reserved = {0}, +}; +} // namespace NativeXComponentSample + +// __attribute__((constructor))修饰的方法由系统自动调用,使用Node-API接口napi_module_register()传入模块描述信息进行模块注册 +extern "C" __attribute__((constructor)) void RegisterEntryModule(void) +{ + napi_module_register(&NativeXComponentSample::demoModule); +} \ No newline at end of file diff --git a/code/BasicFeature/Native/NativeXComponent/entry/src/main/cpp/render/EGLConst.h b/code/BasicFeature/Native/NativeXComponent/entry/src/main/cpp/render/EGLConst.h new file mode 100644 index 0000000000..60c0ad2c3a --- /dev/null +++ b/code/BasicFeature/Native/NativeXComponent/entry/src/main/cpp/render/EGLConst.h @@ -0,0 +1,137 @@ +/* + * Copyright (c) 2025 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef NATIVEXCOMPONENT_EGLCONST_H +#define NATIVEXCOMPONENT_EGLCONST_H +#include +#include +#include + +const unsigned int LOG_PRINT_DOMAIN = 0xFF00; + +/** + * Program error. + */ +const GLuint PROGRAM_ERROR = 0; + +/** + * Position error. + */ +const GLint POSITION_ERROR = -1; + +/** + * Default x position. + */ +const int DEFAULT_X_POSITION = 0; + +/** + * Default y position. + */ +const int DEFAULT_Y_POSITION = 0; + +/** + * Gl red default. + */ +const GLfloat GL_RED_DEFAULT = 0.0; + +/** + * Gl green default. + */ +const GLfloat GL_GREEN_DEFAULT = 0.0; + +/** + * Gl blue default. + */ +const GLfloat GL_BLUE_DEFAULT = 0.0; + +/** + * Gl alpha default. + */ +const GLfloat GL_ALPHA_DEFAULT = 1.0; + +/** + * Pointer size. + */ +const GLint POINTER_SIZE = 2; + +/** + * Triangle fan size. + */ +const GLsizei TRIANGLE_FAN_SIZE = 4; + +/** + * Fifty percent. + */ +const float FIFTY_PERCENT = 0.5; + +/** + * Position handle name. + */ +const char POSITION_NAME[] = "a_position"; + +/** + * Background color #f4f4f4. + */ +const GLfloat BACKGROUND_COLOR[] = {244.0f / 255, 244.0f / 255, 244.0f / 255, 1.0f}; + +/** + * Draw color #7E8FFB. + */ +const GLfloat DRAW_COLOR[] = {126.0f / 255, 143.0f / 255, 251.0f / 255, 1.0f}; + +/** + * Change color #92D6CC. + */ +const GLfloat CHANGE_COLOR[] = {146.0f / 255, 214.0f / 255, 204.0f / 255, 1.0f}; + +/** + * Background area. + */ +const GLfloat BACKGROUND_RECTANGLE_VERTICES[] = {-1.0f, 1.0f, 1.0f, 1.0f, 1.0f, -1.0f, -1.0f, -1.0f}; + +const EGLint ATTRIB_LIST[] = { + // Key,value. + EGL_SURFACE_TYPE, EGL_WINDOW_BIT, EGL_RED_SIZE, 8, EGL_GREEN_SIZE, 8, EGL_BLUE_SIZE, 8, EGL_ALPHA_SIZE, 8, + EGL_RENDERABLE_TYPE, EGL_OPENGL_ES2_BIT, + // End. + EGL_NONE}; + +const EGLint CONTEXT_ATTRIBS[] = {EGL_CONTEXT_CLIENT_VERSION, 2, EGL_NONE}; + +/** + * Vertex shader. + */ +const char VERTEX_SHADER[] = "#version 300 es\n" + "layout(location = 0) in vec4 a_position;\n" + "layout(location = 1) in vec4 a_color; \n" + "out vec4 v_color; \n" + "void main() \n" + "{ \n" + " gl_Position = a_position; \n" + " v_color = a_color; \n" + "} \n"; + +/** + * Fragment shader. + */ +const char FRAGMENT_SHADER[] = "#version 300 es\n" + "precision mediump float; \n" + "in vec4 v_color; \n" + "out vec4 fragColor; \n" + "void main() \n" + "{ \n" + " fragColor = v_color; \n" + "} \n"; +#endif // NATIVEXCOMPONENT_EGLCONST_H diff --git a/code/BasicFeature/Native/NativeXComponent/entry/src/main/cpp/render/EGLRender.cpp b/code/BasicFeature/Native/NativeXComponent/entry/src/main/cpp/render/EGLRender.cpp new file mode 100644 index 0000000000..46b80cedd7 --- /dev/null +++ b/code/BasicFeature/Native/NativeXComponent/entry/src/main/cpp/render/EGLRender.cpp @@ -0,0 +1,302 @@ +/* + * Copyright (c) 2025 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "EGLRender.h" +#include "EGLConst.h" +#include +#include +#include +#include +#include +#include +#include +#include + +namespace { +void Rotate2d(GLfloat centerX, GLfloat centerY, GLfloat *rotateX, GLfloat *rotateY, GLfloat theta) +{ + GLfloat tempX = cos(theta) * (*rotateX - centerX) - sin(theta) * (*rotateY - centerY); + GLfloat tempY = sin(theta) * (*rotateX - centerX) + cos(theta) * (*rotateY - centerY); + *rotateX = tempX + centerX; + *rotateY = tempY + centerY; +} + +GLuint LoadShader(GLenum type, const char *shaderSrc) +{ + if ((type <= 0) || (shaderSrc == nullptr)) { + OH_LOG_Print(LOG_APP, LOG_ERROR, LOG_PRINT_DOMAIN, "EGLRender", "glCreateShader type or shaderSrc error"); + return PROGRAM_ERROR; + } + + GLuint shader = glCreateShader(type); + if (shader == 0) { + OH_LOG_Print(LOG_APP, LOG_ERROR, LOG_PRINT_DOMAIN, "EGLRender", "glCreateShader unable to load shader"); + return PROGRAM_ERROR; + } + + // The gl function has no return value. + glShaderSource(shader, 1, &shaderSrc, nullptr); + glCompileShader(shader); + + GLint compiled; + glGetShaderiv(shader, GL_COMPILE_STATUS, &compiled); + if (compiled != 0) { + return shader; + } + + GLint infoLen = 0; + glGetShaderiv(shader, GL_INFO_LOG_LENGTH, &infoLen); + if (infoLen <= 1) { + glDeleteShader(shader); + return PROGRAM_ERROR; + } + + char *infoLog = (char *)malloc(sizeof(char) * (infoLen + 1)); + if (infoLog != nullptr) { + memset(infoLog, 0, infoLen + 1); + glGetShaderInfoLog(shader, infoLen, nullptr, infoLog); + OH_LOG_Print(LOG_APP, LOG_ERROR, LOG_PRINT_DOMAIN, "EGLRender", "glCompileShader error = %s", infoLog); + free(infoLog); + infoLog = nullptr; + } + glDeleteShader(shader); + return PROGRAM_ERROR; +} + +GLuint CreateProgram(const char *vertexShader, const char *fragShader) +{ + if ((vertexShader == nullptr) || (fragShader == nullptr)) { + OH_LOG_Print(LOG_APP, LOG_ERROR, LOG_PRINT_DOMAIN, "EGLRender", + "createProgram: vertexShader or fragShader is null"); + return PROGRAM_ERROR; + } + + GLuint vertex = LoadShader(GL_VERTEX_SHADER, vertexShader); + if (vertex == PROGRAM_ERROR) { + OH_LOG_Print(LOG_APP, LOG_ERROR, LOG_PRINT_DOMAIN, "EGLRender", "createProgram vertex error"); + return PROGRAM_ERROR; + } + + GLuint fragment = LoadShader(GL_FRAGMENT_SHADER, fragShader); + if (fragment == PROGRAM_ERROR) { + OH_LOG_Print(LOG_APP, LOG_ERROR, LOG_PRINT_DOMAIN, "EGLRender", "createProgram fragment error"); + return PROGRAM_ERROR; + } + + GLuint program = glCreateProgram(); + if (program == PROGRAM_ERROR) { + OH_LOG_Print(LOG_APP, LOG_ERROR, LOG_PRINT_DOMAIN, "EGLRender", "createProgram program error"); + glDeleteShader(vertex); + glDeleteShader(fragment); + return PROGRAM_ERROR; + } + + // The gl function has no return value. + glAttachShader(program, vertex); + glAttachShader(program, fragment); + glLinkProgram(program); + + GLint linked; + glGetProgramiv(program, GL_LINK_STATUS, &linked); + if (linked != 0) { + glDeleteShader(vertex); + glDeleteShader(fragment); + return program; + } + + OH_LOG_Print(LOG_APP, LOG_ERROR, LOG_PRINT_DOMAIN, "EGLRender", "createProgram linked error"); + GLint infoLen = 0; + glGetProgramiv(program, GL_INFO_LOG_LENGTH, &infoLen); + if (infoLen > 1) { + char *infoLog = (char *)malloc(sizeof(char) * (infoLen + 1)); + memset(infoLog, 0, infoLen + 1); + glGetProgramInfoLog(program, infoLen, nullptr, infoLog); + OH_LOG_Print(LOG_APP, LOG_ERROR, LOG_PRINT_DOMAIN, "EGLRender", "glLinkProgram error = %s", infoLog); + free(infoLog); + infoLog = nullptr; + } + glDeleteShader(vertex); + glDeleteShader(fragment); + glDeleteProgram(program); + return PROGRAM_ERROR; +} +} // namespace + +bool EGLRender::SetUpEGLContext(void *window) +{ + OH_LOG_Print(LOG_APP, LOG_INFO, LOG_PRINT_DOMAIN, "EGLRender", "EglContextInit execute"); + eglWindow_ = (EGLNativeWindowType)(window); + // Init display. + eglDisplay_ = eglGetDisplay(EGL_DEFAULT_DISPLAY); + if (eglDisplay_ == EGL_NO_DISPLAY) { + OH_LOG_Print(LOG_APP, LOG_ERROR, LOG_PRINT_DOMAIN, "EGLRender", "eglGetDisplay: unable to get EGL display"); + return false; + } + EGLint majorVersion; + EGLint minorVersion; + if (!eglInitialize(eglDisplay_, &majorVersion, &minorVersion)) { + OH_LOG_Print(LOG_APP, LOG_ERROR, LOG_PRINT_DOMAIN, "EGLRender", + "eglInitialize: unable to get initialize EGL display"); + return false; + }; + // Select configuration. + const EGLint maxConfigSize = 1; + EGLint numConfigs; + if (!eglChooseConfig(eglDisplay_, ATTRIB_LIST, &eglConfig_, maxConfigSize, &numConfigs)) { + OH_LOG_Print(LOG_APP, LOG_ERROR, LOG_PRINT_DOMAIN, "EGLRender", "eglChooseConfig: unable to choose configs"); + return false; + }; + // CreateEnvironment. + // Create surface. + eglSurface_ = eglCreateWindowSurface(eglDisplay_, eglConfig_, eglWindow_, NULL); + if (eglSurface_ == nullptr) { + OH_LOG_Print(LOG_APP, LOG_ERROR, LOG_PRINT_DOMAIN, "EGLRender", + "eglCreateWindowSurface: unable to create surface"); + return false; + } + if (eglSurface_ == nullptr) { + OH_LOG_Print(LOG_APP, LOG_ERROR, LOG_PRINT_DOMAIN, "EGLRender", + "eglCreateWindowSurface: unable to create surface"); + return false; + } + // Create context. + eglContext_ = eglCreateContext(eglDisplay_, eglConfig_, EGL_NO_CONTEXT, CONTEXT_ATTRIBS); + if (!eglMakeCurrent(eglDisplay_, eglSurface_, eglSurface_, eglContext_)) { + OH_LOG_Print(LOG_APP, LOG_ERROR, LOG_PRINT_DOMAIN, "EGLRender", "eglMakeCurrent failed"); + return false; + } + // Create program. + program_ = CreateProgram(VERTEX_SHADER, FRAGMENT_SHADER); + if (program_ == PROGRAM_ERROR) { + OH_LOG_Print(LOG_APP, LOG_ERROR, LOG_PRINT_DOMAIN, "EGLRender", "CreateProgram: unable to create program"); + return false; + } + return true; +} + +GLint EGLRender::PrepareDraw() +{ + if ((eglDisplay_ == nullptr) || (eglSurface_ == nullptr) || (eglContext_ == nullptr) || + (!eglMakeCurrent(eglDisplay_, eglSurface_, eglSurface_, eglContext_))) { + OH_LOG_Print(LOG_APP, LOG_ERROR, LOG_PRINT_DOMAIN, "EGLRender", "PrepareDraw: param error"); + return POSITION_ERROR; + } + + // The gl function has no return value. + glViewport(DEFAULT_X_POSITION, DEFAULT_Y_POSITION, width_, height_); + glClearColor(GL_RED_DEFAULT, GL_GREEN_DEFAULT, GL_BLUE_DEFAULT, GL_ALPHA_DEFAULT); + glClear(GL_COLOR_BUFFER_BIT); + glUseProgram(program_); + + return glGetAttribLocation(program_, POSITION_NAME); +} + +void EGLRender::DrawStar(bool drawColor) +{ + OH_LOG_Print(LOG_APP, LOG_INFO, LOG_PRINT_DOMAIN, "EGLRender", "Draw"); + GLint position = PrepareDraw(); + if (position == POSITION_ERROR) { + OH_LOG_Print(LOG_APP, LOG_ERROR, LOG_PRINT_DOMAIN, "EGLRender", "Draw get position failed"); + return; + } + + if (!ExecuteDraw(position, BACKGROUND_COLOR, BACKGROUND_RECTANGLE_VERTICES)) { + OH_LOG_Print(LOG_APP, LOG_ERROR, LOG_PRINT_DOMAIN, "EGLRender", "Draw execute draw background failed"); + return; + } + + // Divided into five quadrilaterals and calculate one of the quadrilateral's Vertices + GLfloat rotateX = 0; + GLfloat rotateY = FIFTY_PERCENT * height_; + GLfloat centerX = 0; + // Convert DEG(54° & 18°) to RAD + GLfloat centerY = -rotateY * (M_PI / 180 * 54) * (M_PI / 180 * 18); + // Convert DEG(18°) to RAD + GLfloat leftX = -rotateY * (M_PI / 180 * 18); + GLfloat leftY = 0; + // Convert DEG(18°) to RAD + GLfloat rightX = rotateY * (M_PI / 180 * 18); + GLfloat rightY = 0; + + const GLfloat shapeVertices[] = {centerX / width_, centerY / height_, leftX / width_, leftY / height_, + rotateX / width_, rotateY / height_, rightX / width_, rightY / height_}; + auto color = drawColor ? DRAW_COLOR : CHANGE_COLOR; + if (!ExecuteDraw(position, color, shapeVertices)) { + OH_LOG_Print(LOG_APP, LOG_ERROR, LOG_PRINT_DOMAIN, "EGLRender", "Draw execute draw shape failed"); + return; + } + + // Convert DEG(72°) to RAD + GLfloat rad = M_PI / 180 * 72; + // Rotate four times + for (int i = 0; i < 4; ++i) { + Rotate2d(centerX, centerY, &rotateX, &rotateY, rad); + Rotate2d(centerX, centerY, &leftX, &leftY, rad); + Rotate2d(centerX, centerY, &rightX, &rightY, rad); + + const GLfloat shapeVertices[] = {centerX / width_, centerY / height_, leftX / width_, leftY / height_, + rotateX / width_, rotateY / height_, rightX / width_, rightY / height_}; + + if (!ExecuteDraw(position, color, shapeVertices)) { + OH_LOG_Print(LOG_APP, LOG_ERROR, LOG_PRINT_DOMAIN, "EGLRender", "Draw execute draw shape failed"); + return; + } + } + // 将绘制命令提交给GPU,GPU执行完成后将渲染结果显示到屏幕 + glFlush(); + glFinish(); + if (!eglSwapBuffers(eglDisplay_, eglSurface_)) { + OH_LOG_Print(LOG_APP, LOG_ERROR, LOG_PRINT_DOMAIN, "EGLRender", "Draw FinishDraw failed"); + return; + } +} + +bool EGLRender::ExecuteDraw(GLint position, const GLfloat *color, const GLfloat shapeVertices[]) +{ + if ((position > 0) || (color == nullptr)) { + OH_LOG_Print(LOG_APP, LOG_ERROR, LOG_PRINT_DOMAIN, "EGLRender", "ExecuteDraw: param error"); + return false; + } + + // The gl function has no return value. + glVertexAttribPointer(position, POINTER_SIZE, GL_FLOAT, GL_FALSE, 0, shapeVertices); + glEnableVertexAttribArray(position); + glVertexAttrib4fv(1, color); + glDrawArrays(GL_TRIANGLE_FAN, 0, TRIANGLE_FAN_SIZE); + glDisableVertexAttribArray(position); + + return true; +} + +void EGLRender::SetEGLWindowSize(int width, int height) +{ + width_ = width; + height_ = height; +} + +EGLRender::~EGLRender() +{ + if ((eglDisplay_ == nullptr) || (eglSurface_ == nullptr) || (!eglDestroySurface(eglDisplay_, eglSurface_))) { + OH_LOG_Print(LOG_APP, LOG_ERROR, 0xff00, "EGLRender", "Release eglDestroySurface failed"); + } + + if ((eglDisplay_ == nullptr) || (eglContext_ == nullptr) || (!eglDestroyContext(eglDisplay_, eglContext_))) { + OH_LOG_Print(LOG_APP, LOG_ERROR, 0xff00, "EGLRender", "Release eglDestroySurface failed"); + } + + if ((eglDisplay_ == nullptr) || (!eglTerminate(eglDisplay_))) { + OH_LOG_Print(LOG_APP, LOG_ERROR, 0xff00, "EGLRender", "Release eglDestroySurface failed"); + } +} \ No newline at end of file diff --git a/code/BasicFeature/Native/NativeXComponent/entry/src/main/cpp/render/EGLRender.h b/code/BasicFeature/Native/NativeXComponent/entry/src/main/cpp/render/EGLRender.h new file mode 100644 index 0000000000..7eb3bb812b --- /dev/null +++ b/code/BasicFeature/Native/NativeXComponent/entry/src/main/cpp/render/EGLRender.h @@ -0,0 +1,48 @@ +/* + * Copyright (c) 2025 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef NATIVEXCOMPONENT_EGLRENDER_H +#define NATIVEXCOMPONENT_EGLRENDER_H + +#include "EGLConst.h" +#include +#include +#include +#include +#include + +class EGLRender { +public: + bool SetUpEGLContext(void *window); + void SetEGLWindowSize(int width, int height); + void DrawStar(bool drawColor); + + std::string xcomponentId; + EGLNativeWindowType eglWindow_; + + EGLDisplay eglDisplay_ = EGL_NO_DISPLAY; + EGLConfig eglConfig_ = EGL_NO_CONFIG_KHR; + EGLSurface eglSurface_ = EGL_NO_SURFACE; + EGLContext eglContext_ = EGL_NO_CONTEXT; + GLuint program_; + int width_ = 0; + int height_ = 0; + ~EGLRender(); + +private: + GLint PrepareDraw(); + bool ExecuteDraw(GLint position, const GLfloat *color, const GLfloat shapeVertices[]); +}; +#endif // NATIVEXCOMPONENT_EGLRENDER_H diff --git a/code/BasicFeature/Native/NativeXComponent/entry/src/main/cpp/types/libnativerender/Index.d.ts b/code/BasicFeature/Native/NativeXComponent/entry/src/main/cpp/types/libnativerender/Index.d.ts new file mode 100644 index 0000000000..ede5fd44a7 --- /dev/null +++ b/code/BasicFeature/Native/NativeXComponent/entry/src/main/cpp/types/libnativerender/Index.d.ts @@ -0,0 +1,18 @@ +/* + * Copyright (c) 2025 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +export const bindNode: (id: string, node: object) => void; +export const unbindNode: (id: string) => void; +export const setFrameRate: (id: string, min: number, max: number, expected: number) => void; +export const setNeedSoftKeyboard: (id: string, needSoftKeyborad: boolean) => void; diff --git a/code/BasicFeature/Native/NativeXComponent/entry/src/main/cpp/types/libnativerender/oh-package.json5 b/code/BasicFeature/Native/NativeXComponent/entry/src/main/cpp/types/libnativerender/oh-package.json5 new file mode 100644 index 0000000000..78545bfb40 --- /dev/null +++ b/code/BasicFeature/Native/NativeXComponent/entry/src/main/cpp/types/libnativerender/oh-package.json5 @@ -0,0 +1,21 @@ +/* + * Copyright (c) 2025 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +{ + "name": "libnativerender.so", + "types": "./Index.d.ts", + "version": "1.0.0", + "description": "Please describe the basic information." +} \ No newline at end of file diff --git a/code/BasicFeature/Native/NativeXComponent/entry/src/main/ets/entryability/EntryAbility.ets b/code/BasicFeature/Native/NativeXComponent/entry/src/main/ets/entryability/EntryAbility.ets new file mode 100644 index 0000000000..6a1b23532e --- /dev/null +++ b/code/BasicFeature/Native/NativeXComponent/entry/src/main/ets/entryability/EntryAbility.ets @@ -0,0 +1,56 @@ +/* + * Copyright (c) 2025 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { AbilityConstant, UIAbility, Want } from '@kit.AbilityKit'; +import { hilog } from '@kit.PerformanceAnalysisKit'; +import { window } from '@kit.ArkUI'; + +export default class EntryAbility extends UIAbility { + onCreate(want: Want, launchParam: AbilityConstant.LaunchParam): void { + hilog.info(0x0000, 'testTag', '%{public}s', 'Ability onCreate'); + } + + onDestroy(): void { + hilog.info(0x0000, 'testTag', '%{public}s', 'Ability onDestroy'); + } + + onWindowStageCreate(windowStage: window.WindowStage): void { + // Main window is created, set main page for this ability + hilog.info(0x0000, 'testTag', '%{public}s', 'Ability onWindowStageCreate'); + + windowStage.loadContent('pages/Index', (err) => { + if (err.code) { + hilog.error(0x0000, 'testTag', 'Failed to load the content. Cause: %{public}s', JSON.stringify(err) ?? ''); + return; + } + hilog.info(0x0000, 'testTag', 'Succeeded in loading the content.'); + }); + } + + onWindowStageDestroy(): void { + // Main window is destroyed, release UI related resources + hilog.info(0x0000, 'testTag', '%{public}s', 'Ability onWindowStageDestroy'); + } + + onForeground(): void { + // Ability has brought to foreground + hilog.info(0x0000, 'testTag', '%{public}s', 'Ability onForeground'); + } + + onBackground(): void { + // Ability has back to background + hilog.info(0x0000, 'testTag', '%{public}s', 'Ability onBackground'); + } +}; diff --git a/code/BasicFeature/Native/NativeXComponent/entry/src/main/ets/entrybackupability/EntryBackupAbility.ets b/code/BasicFeature/Native/NativeXComponent/entry/src/main/ets/entrybackupability/EntryBackupAbility.ets new file mode 100644 index 0000000000..2a89be4fd2 --- /dev/null +++ b/code/BasicFeature/Native/NativeXComponent/entry/src/main/ets/entrybackupability/EntryBackupAbility.ets @@ -0,0 +1,27 @@ +/* + * Copyright (c) 2025 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { hilog } from '@kit.PerformanceAnalysisKit'; +import { BackupExtensionAbility, BundleVersion } from '@kit.CoreFileKit'; + +export default class EntryBackupAbility extends BackupExtensionAbility { + async onBackup() { + hilog.info(0x0000, 'testTag', 'onBackup ok'); + } + + async onRestore(bundleVersion: BundleVersion) { + hilog.info(0x0000, 'testTag', 'onRestore ok %{public}s', JSON.stringify(bundleVersion)); + } +} \ No newline at end of file diff --git a/code/BasicFeature/Native/NativeXComponent/entry/src/main/ets/pages/Index.ets b/code/BasicFeature/Native/NativeXComponent/entry/src/main/ets/pages/Index.ets new file mode 100644 index 0000000000..b2fe86027d --- /dev/null +++ b/code/BasicFeature/Native/NativeXComponent/entry/src/main/ets/pages/Index.ets @@ -0,0 +1,123 @@ +/* + * Copyright (c) 2025 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +import native from 'libnativerender.so'; + +@Entry +@Component +struct Index { + xcomponentId: string = 'xcp' + (new Date().getTime()); + @State isShow: boolean = true; + @State minRate: number = 0; + @State maxRate: number = 120; + @State expected: number = 60; + needSoftKeyboard: boolean = false; + @State needSoftKeyboardState: string = 'needSoftKeyboard=' + this.needSoftKeyboard; + @State text: string = '单指点击XComponent软键盘消失' + controller: TextInputController = new TextInputController() + + build() { + Column() { + TextInput({ text: this.text, placeholder: 'please input ...', controller: this.controller }) + .id('textInput') + .placeholderColor(Color.Grey) + .placeholderFont({ size: 14, weight: 400 }) + .caretColor(Color.Blue) + .width(400) + .height(40) + .margin(20) + .fontSize(14) + .fontColor(Color.Black) + .onChange((value: string) => { + this.text = value + }) + Column() { + if (this.isShow) { + XComponent({ + type: XComponentType.SURFACE + }) + .id(this.xcomponentId) + .onAttach(() => { + let node = this.getUIContext().getFrameNodeById(this.xcomponentId) + native.bindNode(this.xcomponentId, node) + }) + .onDetach(() => { + native.unbindNode(this.xcomponentId) + }) + .width(200) + .height(200) + .focusable(true) + .focusOnTouch(true) + .defaultFocus(true) + } + }.height(200) + + Button('创建/销毁').onClick(() => { + this.isShow = !this.isShow; + }) + + Column() { + Text('期望帧率设置:') + .textAlign(TextAlign.Start) + .fontSize(15) + .border({ width: 1 }) + .padding(10) + .width('100%') + .margin(5) + Text('min: ' + this.minRate) + Slider({ + value: this.minRate, + min: 0, + max: 240, + step: 1 + }).onChange((value: number, mode: SliderChangeMode) => { + this.minRate = value; + native.setFrameRate(this.xcomponentId, this.minRate, this.maxRate, this.expected) + }).width('100%') + .id('minSlider') + Text('max: ' + this.maxRate) + Slider({ + value: this.maxRate, + min: 0, + max: 240, + step: 1 + }).onChange((value: number, mode: SliderChangeMode) => { + this.maxRate = value; + native.setFrameRate(this.xcomponentId, this.minRate, this.maxRate, this.expected) + }).width('100%') + .id('maxSlider') + Text('expected: ' + this.expected) + Slider({ + value: this.expected, + min: 0, + max: 240, + step: 1 + }).onChange((value: number, mode: SliderChangeMode) => { + this.expected = value; + native.setFrameRate(this.xcomponentId, this.minRate, this.maxRate, this.expected) + }).width('100%') + .id('expectedSlider') + }.backgroundColor("#F0FAFF") + + Button(this.needSoftKeyboardState) + .onClick(() => { + this.needSoftKeyboard = !this.needSoftKeyboard; + this.needSoftKeyboardState = 'needSoftKeyboard=' + this.needSoftKeyboard; + native.setNeedSoftKeyboard(this.xcomponentId, this.needSoftKeyboard); + this.text = this.needSoftKeyboard ? '单指点击XComponent软键盘不消失' : '单指点击XComponent软键盘消失' + }) + } + .width('100%') + } +} \ No newline at end of file diff --git a/code/BasicFeature/Native/NativeXComponent/entry/src/main/module.json5 b/code/BasicFeature/Native/NativeXComponent/entry/src/main/module.json5 new file mode 100644 index 0000000000..2cd3a6c601 --- /dev/null +++ b/code/BasicFeature/Native/NativeXComponent/entry/src/main/module.json5 @@ -0,0 +1,51 @@ +{ + "module": { + "name": "entry", + "type": "entry", + "description": "$string:module_desc", + "mainElement": "EntryAbility", + "deviceTypes": [ + "default", + "tablet" + ], + "deliveryWithInstall": true, + "installationFree": false, + "pages": "$profile:main_pages", + "abilities": [ + { + "name": "EntryAbility", + "srcEntry": "./ets/entryability/EntryAbility.ets", + "description": "$string:EntryAbility_desc", + "icon": "$media:layered_image", + "label": "$string:EntryAbility_label", + "startWindowIcon": "$media:startIcon", + "startWindowBackground": "$color:start_window_background", + "exported": true, + "skills": [ + { + "entities": [ + "entity.system.home" + ], + "actions": [ + "action.system.home" + ] + } + ] + } + ], + "extensionAbilities": [ + { + "name": "EntryBackupAbility", + "srcEntry": "./ets/entrybackupability/EntryBackupAbility.ets", + "type": "backup", + "exported": false, + "metadata": [ + { + "name": "ohos.extension.backup", + "resource": "$profile:backup_config" + } + ] + } + ] + } +} \ No newline at end of file diff --git a/code/BasicFeature/Native/NativeXComponent/entry/src/main/resources/base/element/color.json b/code/BasicFeature/Native/NativeXComponent/entry/src/main/resources/base/element/color.json new file mode 100644 index 0000000000..3c712962da --- /dev/null +++ b/code/BasicFeature/Native/NativeXComponent/entry/src/main/resources/base/element/color.json @@ -0,0 +1,8 @@ +{ + "color": [ + { + "name": "start_window_background", + "value": "#FFFFFF" + } + ] +} \ No newline at end of file diff --git a/code/BasicFeature/Native/NativeXComponent/entry/src/main/resources/base/element/string.json b/code/BasicFeature/Native/NativeXComponent/entry/src/main/resources/base/element/string.json new file mode 100644 index 0000000000..f94595515a --- /dev/null +++ b/code/BasicFeature/Native/NativeXComponent/entry/src/main/resources/base/element/string.json @@ -0,0 +1,16 @@ +{ + "string": [ + { + "name": "module_desc", + "value": "module description" + }, + { + "name": "EntryAbility_desc", + "value": "description" + }, + { + "name": "EntryAbility_label", + "value": "label" + } + ] +} \ No newline at end of file diff --git a/code/BasicFeature/Native/NativeXComponent/entry/src/main/resources/base/media/background.png b/code/BasicFeature/Native/NativeXComponent/entry/src/main/resources/base/media/background.png new file mode 100644 index 0000000000000000000000000000000000000000..f939c9fa8cc8914832e602198745f592a0dfa34d GIT binary patch literal 57364 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 A4*&oF literal 0 HcmV?d00001 diff --git a/code/BasicFeature/Native/NativeXComponent/entry/src/main/resources/base/media/foreground.png b/code/BasicFeature/Native/NativeXComponent/entry/src/main/resources/base/media/foreground.png new file mode 100644 index 0000000000000000000000000000000000000000..4483ddad1f079e1089d685bd204ee1cfe1d01902 GIT binary patch literal 12430 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 cSLciz6AsI{U0tD9;7S&f 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

c)ijgxDm}8EsRXFt3h@+Ufr7@DN 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 literal 0 HcmV?d00001 diff --git a/code/BasicFeature/Native/NativeXComponent/entry/src/main/resources/base/profile/backup_config.json b/code/BasicFeature/Native/NativeXComponent/entry/src/main/resources/base/profile/backup_config.json new file mode 100644 index 0000000000..78f40ae7c4 --- /dev/null +++ b/code/BasicFeature/Native/NativeXComponent/entry/src/main/resources/base/profile/backup_config.json @@ -0,0 +1,3 @@ +{ + "allowToBackupRestore": true +} \ No newline at end of file diff --git a/code/BasicFeature/Native/NativeXComponent/entry/src/main/resources/base/profile/main_pages.json b/code/BasicFeature/Native/NativeXComponent/entry/src/main/resources/base/profile/main_pages.json new file mode 100644 index 0000000000..1898d94f58 --- /dev/null +++ b/code/BasicFeature/Native/NativeXComponent/entry/src/main/resources/base/profile/main_pages.json @@ -0,0 +1,5 @@ +{ + "src": [ + "pages/Index" + ] +} diff --git a/code/BasicFeature/Native/NativeXComponent/entry/src/main/resources/en_US/element/string.json b/code/BasicFeature/Native/NativeXComponent/entry/src/main/resources/en_US/element/string.json new file mode 100644 index 0000000000..f94595515a --- /dev/null +++ b/code/BasicFeature/Native/NativeXComponent/entry/src/main/resources/en_US/element/string.json @@ -0,0 +1,16 @@ +{ + "string": [ + { + "name": "module_desc", + "value": "module description" + }, + { + "name": "EntryAbility_desc", + "value": "description" + }, + { + "name": "EntryAbility_label", + "value": "label" + } + ] +} \ No newline at end of file diff --git a/code/BasicFeature/Native/NativeXComponent/entry/src/main/resources/zh_CN/element/string.json b/code/BasicFeature/Native/NativeXComponent/entry/src/main/resources/zh_CN/element/string.json new file mode 100644 index 0000000000..597ecf95e6 --- /dev/null +++ b/code/BasicFeature/Native/NativeXComponent/entry/src/main/resources/zh_CN/element/string.json @@ -0,0 +1,16 @@ +{ + "string": [ + { + "name": "module_desc", + "value": "模块描述" + }, + { + "name": "EntryAbility_desc", + "value": "description" + }, + { + "name": "EntryAbility_label", + "value": "label" + } + ] +} \ No newline at end of file diff --git a/code/BasicFeature/Native/NativeXComponent/entry/src/mock/Libentry.mock.ets b/code/BasicFeature/Native/NativeXComponent/entry/src/mock/Libentry.mock.ets new file mode 100644 index 0000000000..c2171716d0 --- /dev/null +++ b/code/BasicFeature/Native/NativeXComponent/entry/src/mock/Libentry.mock.ets @@ -0,0 +1,7 @@ +const NativeMock: Record = { + 'add': (a: number, b: number) => { + return a + b; + }, +}; + +export default NativeMock; \ No newline at end of file diff --git a/code/BasicFeature/Native/NativeXComponent/entry/src/mock/mock-config.json5 b/code/BasicFeature/Native/NativeXComponent/entry/src/mock/mock-config.json5 new file mode 100644 index 0000000000..6540976c9a --- /dev/null +++ b/code/BasicFeature/Native/NativeXComponent/entry/src/mock/mock-config.json5 @@ -0,0 +1,5 @@ +{ + "libentry.so": { + "source": "src/mock/Libentry.mock.ets" + } +} \ No newline at end of file diff --git a/code/BasicFeature/Native/NativeXComponent/entry/src/ohosTest/ets/test/Ability.test.ets b/code/BasicFeature/Native/NativeXComponent/entry/src/ohosTest/ets/test/Ability.test.ets new file mode 100644 index 0000000000..d0a983484d --- /dev/null +++ b/code/BasicFeature/Native/NativeXComponent/entry/src/ohosTest/ets/test/Ability.test.ets @@ -0,0 +1,229 @@ +/* + * Copyright (c) 2025 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import AbilityDelegatorRegistry from '@ohos.app.ability.abilityDelegatorRegistry'; +import { describe, it, expect } from '@ohos/hypium'; +import { Driver, MatchPattern, ON, MouseButton } from '@ohos.UiTest'; + +const TAG = '[Sample_NDK_XComponent]'; + +export default function abilityTest() { + + describe('ActsAbilityTest', () => { + /** + * 打开应用 + */ + it('StartAbility_001', 0, async (done: Function) => { + console.info(TAG, 'StartAbility_001 begin'); + let driver = Driver.create(); + let abilityDelegator = AbilityDelegatorRegistry.getAbilityDelegator(); + try { + await abilityDelegator.startAbility({ + bundleName: 'com.example.nativexcomponent', + abilityName: 'EntryAbility' + }); + } catch (exception) { + console.info(TAG, `StartAbility_001 exception = ${JSON.stringify(exception)}`); + expect().assertFail(); + } + await driver.delayMs(1000); + // 判断XComponent onLoad回调执行成功 + await driver.assertComponentExist(ON.text('期望帧率设置:')); + await driver.assertComponentExist(ON.text('单指点击XComponent软键盘消失')); + await driver.assertComponentExist(ON.text('创建/销毁')); + await driver.assertComponentExist(ON.text('needSoftKeyboard=',MatchPattern.STARTS_WITH)); + done(); + console.info(TAG, 'StartAbility_001 end'); + }) + + /** + * 点击按钮,按钮 + */ + it('DrawShape_001', 2, async (done: Function) => { + console.info(TAG, 'CreateFiles_001 begin'); + let driver = Driver.create(); + // 判断XComponent onLoad回调执行成功 + await driver.assertComponentExist(ON.text('单指点击XComponent软键盘消失')); + await driver.assertComponentExist(ON.id('xcp',MatchPattern.STARTS_WITH)); + // 判断是否有按键 + await driver.assertComponentExist(ON.text('创建/销毁')); + let drawStarBtn = await driver.findComponent(ON.text('创建/销毁')); + // 点击'创建/销毁'按钮 + await drawStarBtn.click(); + await driver.delayMs(1000); + + // 判断xcomponent组件已经消失 + let xcomponent = await driver.findComponent(ON.id('xcp', MatchPattern.STARTS_WITH)); + expect(xcomponent === null).assertTrue(); + + await drawStarBtn.click(); + await driver.delayMs(1000); + // 判断xcomponent组件复现 + let xcomponent2 = await driver.findComponent(ON.id('xcp', MatchPattern.STARTS_WITH)); + expect(xcomponent2 === null).assertFalse(); + done(); + console.info(TAG, 'DrawShape_001 end'); + }) + + it('DrawShape_002', 2, async (done: Function) => { + console.info(TAG, 'DrawShape_002 begin'); + let driver = Driver.create(); + // 判断XComponent onLoad回调执行成功 + await driver.assertComponentExist(ON.text('单指点击XComponent软键盘消失')); + await driver.assertComponentExist(ON.id('xcp',MatchPattern.STARTS_WITH)); + // 判断是否有按键 + await driver.assertComponentExist(ON.text('创建/销毁')); + + // 点击XComponent组件 + let xcomponent = await driver.findComponent(ON.id('xcp', MatchPattern.STARTS_WITH)); + expect(xcomponent === null).assertFalse(); + await xcomponent.click(); + await driver.delayMs(1000); + // 判断touch回调已执行 + await driver.assertComponentExist(ON.id('xcp',MatchPattern.STARTS_WITH)); + done(); + console.info(TAG, 'DrawShape_002 end'); + }) + + it('SetExpectedFrameRate_001 ', 2, async (done: Function) => { + console.info(TAG, 'SetExpectedFrameRate_001 start'); + let driver = await Driver.create(); + await driver.delayMs(1000); + await driver.assertComponentExist(ON.text('期望帧率设置:')); + await driver.assertComponentExist(ON.text('单指点击XComponent软键盘消失')); + await driver.assertComponentExist(ON.text('创建/销毁')); + await driver.assertComponentExist(ON.text('needSoftKeyboard', MatchPattern.STARTS_WITH)); + + let minBtn = await driver.findComponent(ON.text('min', MatchPattern.STARTS_WITH)); + expect(minBtn === null).assertFalse(); + + let minSlider = await driver.findComponent(ON.id('minSlider')); + expect(minSlider === null).assertFalse(); + let point = await minSlider.getBoundsCenter(); + await driver.mouseClick(point, MouseButton.MOUSE_BUTTON_LEFT); + await driver.delayMs(1000); + + let text = await minBtn.getText(); + expect(text.toString() == 'min: 120').assertTrue(); + + done(); + console.info(TAG, 'SetExpectedFrameRate_001 end'); + }) + + it('SetExpectedFrameRate_002 ', 2, async (done: Function) => { + console.info(TAG, 'SetExpectedFrameRate_002 start'); + let driver = await Driver.create(); + await driver.delayMs(1000); + await driver.assertComponentExist(ON.text('期望帧率设置:')); + await driver.assertComponentExist(ON.text('单指点击XComponent软键盘消失')); + await driver.assertComponentExist(ON.text('创建/销毁')); + await driver.assertComponentExist(ON.text('needSoftKeyboard', MatchPattern.STARTS_WITH)); + + let maxBtn = await driver.findComponent(ON.text('max', MatchPattern.STARTS_WITH)); + expect(maxBtn === null).assertFalse(); + + let maxSlider = await driver.findComponent(ON.id('maxSlider')); + expect(maxSlider === null).assertFalse(); + let rect = await maxSlider.getBounds(); + await driver.mouseClick({x:rect.right, y:(rect.top+rect.bottom)/2}, MouseButton.MOUSE_BUTTON_LEFT); + await driver.delayMs(1000); + + let text = await maxBtn.getText(); + console.info('yys', text); + expect(text.toString() == 'max: 240').assertTrue(); + + done(); + console.info(TAG, 'SetExpectedFrameRate_002 end'); + }) + + it('SetExpectedFrameRate_003 ', 2, async (done: Function) => { + console.info(TAG, 'SetExpectedFrameRate_003 start'); + let driver = await Driver.create(); + await driver.delayMs(1000); + await driver.assertComponentExist(ON.text('期望帧率设置:')); + await driver.assertComponentExist(ON.text('单指点击XComponent软键盘消失')); + await driver.assertComponentExist(ON.text('创建/销毁')); + await driver.assertComponentExist(ON.text('needSoftKeyboard', MatchPattern.STARTS_WITH)); + + let expectedBtn = await driver.findComponent(ON.text('expected', MatchPattern.STARTS_WITH)); + expect(expectedBtn === null).assertFalse(); + + let expectedSlider = await driver.findComponent(ON.id('expectedSlider')); + expect(expectedSlider === null).assertFalse(); + let point = await expectedSlider.getBoundsCenter(); + await driver.mouseClick(point, MouseButton.MOUSE_BUTTON_LEFT); + await driver.delayMs(1000); + + let text = await expectedBtn.getText(); + expect(text.toString() == 'expected: 120').assertTrue(); + + done(); + console.info(TAG, 'SetExpectedFrameRate_003 end'); + }) + + it('SetSoftKeyboard_001', 2, async (done: Function) => { + console.info(TAG, 'SetSoftKeyboard_001 start'); + let driver = Driver.create(); + await driver.delayMs(1000); + await driver.assertComponentExist(ON.text('期望帧率设置:')); + await driver.assertComponentExist(ON.text('单指点击XComponent软键盘消失')); + await driver.assertComponentExist(ON.text('创建/销毁')); + await driver.assertComponentExist(ON.text('needSoftKeyboard', MatchPattern.STARTS_WITH)); + + let text = await driver.findComponent(ON.id('textInput')); + expect(text === null).assertFalse(); + await text.click(); + await driver.delayMs(1000); + expect(ON.text('needSoftKeyboard', MatchPattern.STARTS_WITH) == null).assertFalse(); + + // 点击XComponent组件 + let xcomponent = await driver.findComponent(ON.id('xcp', MatchPattern.STARTS_WITH)); + expect(xcomponent === null).assertFalse(); + await xcomponent.click(); + await driver.delayMs(1000); + + done(); + console.info(TAG, 'SetSoftKeyboard_001 end'); + }) + + it('SetSoftKeyboard_002', 2, async (done: Function) => { + console.info(TAG, 'SetSoftKeyboard_002 start'); + let driver = Driver.create(); + await driver.delayMs(1000); + await driver.assertComponentExist(ON.text('期望帧率设置:')); + await driver.assertComponentExist(ON.text('单指点击XComponent软键盘消失')); + await driver.assertComponentExist(ON.text('创建/销毁')); + await driver.assertComponentExist(ON.text('needSoftKeyboard', MatchPattern.STARTS_WITH)); + + let button_softKeyboard = await driver.findComponent(ON.text('needSoftKeyboard', MatchPattern.STARTS_WITH)); + expect(button_softKeyboard === null).assertFalse(); + await button_softKeyboard.click(); + let text = await driver.findComponent(ON.id('textInput')); + expect(text === null).assertFalse(); + await text.click(); + await driver.delayMs(1000); + expect(ON.text('needSoftKeyboard', MatchPattern.STARTS_WITH) == null).assertFalse(); + + // 点击XComponent组件 + let xcomponent = await driver.findComponent(ON.id('xcp', MatchPattern.STARTS_WITH)); + expect(xcomponent === null).assertFalse(); + await xcomponent.click(); + await driver.delayMs(1000); + + done(); + console.info(TAG, 'SetSoftKeyboard_002 end'); + }) + }) +} \ No newline at end of file diff --git a/code/BasicFeature/Native/NativeXComponent/entry/src/ohosTest/ets/test/List.test.ets b/code/BasicFeature/Native/NativeXComponent/entry/src/ohosTest/ets/test/List.test.ets new file mode 100644 index 0000000000..794c7dc4ed --- /dev/null +++ b/code/BasicFeature/Native/NativeXComponent/entry/src/ohosTest/ets/test/List.test.ets @@ -0,0 +1,5 @@ +import abilityTest from './Ability.test'; + +export default function testsuite() { + abilityTest(); +} \ No newline at end of file diff --git a/code/BasicFeature/Native/NativeXComponent/entry/src/ohosTest/module.json5 b/code/BasicFeature/Native/NativeXComponent/entry/src/ohosTest/module.json5 new file mode 100644 index 0000000000..6902687277 --- /dev/null +++ b/code/BasicFeature/Native/NativeXComponent/entry/src/ohosTest/module.json5 @@ -0,0 +1,12 @@ +{ + "module": { + "name": "entry_test", + "type": "feature", + "deviceTypes": [ + "default", + "tablet" + ], + "deliveryWithInstall": true, + "installationFree": false + } +} diff --git a/code/BasicFeature/Native/NativeXComponent/entry/src/test/List.test.ets b/code/BasicFeature/Native/NativeXComponent/entry/src/test/List.test.ets new file mode 100644 index 0000000000..bb5b5c3731 --- /dev/null +++ b/code/BasicFeature/Native/NativeXComponent/entry/src/test/List.test.ets @@ -0,0 +1,5 @@ +import localUnitTest from './LocalUnit.test'; + +export default function testsuite() { + localUnitTest(); +} \ No newline at end of file diff --git a/code/BasicFeature/Native/NativeXComponent/entry/src/test/LocalUnit.test.ets b/code/BasicFeature/Native/NativeXComponent/entry/src/test/LocalUnit.test.ets new file mode 100644 index 0000000000..165fc1615e --- /dev/null +++ b/code/BasicFeature/Native/NativeXComponent/entry/src/test/LocalUnit.test.ets @@ -0,0 +1,33 @@ +import { describe, beforeAll, beforeEach, afterEach, afterAll, it, expect } from '@ohos/hypium'; + +export default function localUnitTest() { + describe('localUnitTest', () => { + // Defines a test suite. Two parameters are supported: test suite name and test suite function. + beforeAll(() => { + // Presets an action, which is performed only once before all test cases of the test suite start. + // This API supports only one parameter: preset action function. + }); + beforeEach(() => { + // Presets an action, which is performed before each unit test case starts. + // The number of execution times is the same as the number of test cases defined by **it**. + // This API supports only one parameter: preset action function. + }); + afterEach(() => { + // Presets a clear action, which is performed after each unit test case ends. + // The number of execution times is the same as the number of test cases defined by **it**. + // This API supports only one parameter: clear action function. + }); + afterAll(() => { + // Presets a clear action, which is performed after all test cases of the test suite end. + // This API supports only one parameter: clear action function. + }); + it('assertContain', 0, () => { + // Defines a test case. This API supports three parameters: test case name, filter parameter, and test case function. + let a = 'abc'; + let b = 'b'; + // Defines a variety of assertion methods, which are used to declare expected boolean conditions. + expect(a).assertContain(b); + expect(a).assertEqual(a); + }); + }); +} \ No newline at end of file diff --git a/code/BasicFeature/Native/NativeXComponent/hvigor/hvigor-config.json5 b/code/BasicFeature/Native/NativeXComponent/hvigor/hvigor-config.json5 new file mode 100644 index 0000000000..06b2783670 --- /dev/null +++ b/code/BasicFeature/Native/NativeXComponent/hvigor/hvigor-config.json5 @@ -0,0 +1,22 @@ +{ + "modelVersion": "5.0.0", + "dependencies": { + }, + "execution": { + // "analyze": "normal", /* Define the build analyze mode. Value: [ "normal" | "advanced" | false ]. Default: "normal" */ + // "daemon": true, /* Enable daemon compilation. Value: [ true | false ]. Default: true */ + // "incremental": true, /* Enable incremental compilation. Value: [ true | false ]. Default: true */ + // "parallel": true, /* Enable parallel compilation. Value: [ true | false ]. Default: true */ + // "typeCheck": false, /* Enable typeCheck. Value: [ true | false ]. Default: false */ + }, + "logging": { + // "level": "info" /* Define the log level. Value: [ "debug" | "info" | "warn" | "error" ]. Default: "info" */ + }, + "debugging": { + // "stacktrace": false /* Disable stacktrace compilation. Value: [ true | false ]. Default: false */ + }, + "nodeOptions": { + // "maxOldSpaceSize": 8192 /* Enable nodeOptions maxOldSpaceSize compilation. Unit M. Used for the daemon process. Default: 8192*/ + // "exposeGC": true /* Enable to trigger garbage collection explicitly. Default: true*/ + } +} diff --git a/code/BasicFeature/Native/NativeXComponent/hvigorfile.ts b/code/BasicFeature/Native/NativeXComponent/hvigorfile.ts new file mode 100644 index 0000000000..f3cb9f1a87 --- /dev/null +++ b/code/BasicFeature/Native/NativeXComponent/hvigorfile.ts @@ -0,0 +1,6 @@ +import { appTasks } from '@ohos/hvigor-ohos-plugin'; + +export default { + system: appTasks, /* Built-in plugin of Hvigor. It cannot be modified. */ + plugins:[] /* Custom plugin to extend the functionality of Hvigor. */ +} diff --git a/code/BasicFeature/Native/NativeXComponent/oh-package.json5 b/code/BasicFeature/Native/NativeXComponent/oh-package.json5 new file mode 100644 index 0000000000..ebdda7e54d --- /dev/null +++ b/code/BasicFeature/Native/NativeXComponent/oh-package.json5 @@ -0,0 +1,10 @@ +{ + "modelVersion": "5.0.0", + "description": "Please describe the basic information.", + "dependencies": { + }, + "devDependencies": { + "@ohos/hypium": "1.0.18", + "@ohos/hamock": "1.0.0" + } +} diff --git a/code/BasicFeature/Native/NativeXComponent/screenshots/device/changeColor.jpeg b/code/BasicFeature/Native/NativeXComponent/screenshots/device/changeColor.jpeg new file mode 100644 index 0000000000000000000000000000000000000000..1cf3eadd18c945d30fe7d092a847fb693e488ed1 GIT binary patch literal 54161 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�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