接入ArkTS页面
使用NDK接口构建UI界面时,需要在ArkTS页面创建用于挂载NDK接口创建组件的占位组件。
占位组件
使用NDK接口构建UI界面时,需要在ArkTS页面创建用于挂载NDK接口创建组件的占位组件。占位组件类型为ContentSlot,ContentSlot能够绑定一个NodeContent对象,该对象可通过Node-API传递到Native侧挂载显示Native组件。
-
NDK配置文件oh-package.json5如下。
- {
- "name": "libentry.so",
- "types": "./index.d.ts",
- "version": "",
- "description": "Please describe the basic information."
- }
-
占位组件和其他ArkTS系统组件使用方法相同。详细代码请参考示例。
- import { NodeContent } from '@kit.ArkUI';
- @Entry
- @Component
- struct Index {
- // 初始化NodeContent对象。
- private rootSlot = new NodeContent();
- @State @Watch('changeNativeFlag') showNative: boolean = false;
- changeNativeFlag(): void {
- if (this.showNative) {
- // 传递NodeContent对象用于Native创建组件的挂载显示
- nativeNode.createNativeRoot(this.rootSlot)
- } else {
- // 销毁NativeModule组件
- nativeNode.destroyNativeRoot()
- }
- }
- build() {
- Column() {
- Button(this.showNative ? "HideNativeUI" : "ShowNativeUI").onClick(() => {
- this.showNative = !this.showNative
- })
- Row() {
- // 将NodeContent和ContentSlot占位组件绑定。
- ContentSlot(this.rootSlot)
- }.layoutWeight(1)
- }
- .width('100%')
- .height('100%')
- }
- }
-
占位组件可以通过相关接口在Native侧转化为挂载对象。
- ArkUI_NodeContentHandle contentHandle;
- OH_ArkUI_GetNodeContentFromNapiValue(env, args[0], &contentHandle);
-
挂载对象提供了相关挂载和卸载组件接口。
- OH_ArkUI_NodeContent_AddNode(handle_, myNativeNode);
- OH_ArkUI_NodeContent_RemoveNode(handle_, myNativeNode);
NDK组件模块
NDK提供的UI组件能力如组件创建、树操作、属性设置、事件注册等是通过函数指针结构体(如ArkUI_NativeNodeAPI_1)进行暴露,该函数指针结构体可以通过模块查询接口获取。
- ArkUI_NativeNodeAPI_1* arkUINativeNodeApi = nullptr;
- OH_ArkUI_GetModuleInterface(ARKUI_NATIVE_NODE, ArkUI_NativeNodeAPI_1, arkUINativeNodeApi);
在获取到函数指针结构体后,可以使用该结构体内的函数实现相关UI组件操作。
-
组件创建和销毁。
- auto listNode = arkUINativeNodeApi->createNode(ARKUI_NODE_LIST);
- arkUINativeNodeApi->disposeNode(listNode);
获取NDK接口支持的组件范围可以通过查询ArkUI_NodeType枚举值。
-
组件树操作。
- auto parent = arkUINativeNodeApi->createNode(ARKUI_NODE_STACK);
- auto child = arkUINativeNodeApi->createNode(ARKUI_NODE_STACK);
- arkUINativeNodeApi->addChild(parent, child);
- arkUINativeNodeApi->removeChild(parent, child);
-
属性设置。
- auto stack = arkUINativeNodeApi->createNode(ARKUI_NODE_STACK);
- ArkUI_NumberValue value[] = {{.f32 = 100}};
- ArkUI_AttributeItem item = {value, 1};
- arkUINativeNodeApi->setAttribute(stack, NODE_WIDTH, &item);
- ArkUI_NumberValue value[] = {{.u32 = 0xff112233}};
- ArkUI_AttributeItem item = {value, 1};
- arkUINativeNodeApi->setAttribute(stack, NODE_BACKGROUND_COLOR, &item);
获取NDK接口支持的属性范围可以通过查询ArkUI_NodeAttributeType枚举值。
-
事件注册。
- auto stack = arkUINativeNodeApi->createNode(ARKUI_NODE_STACK);
- arkUINativeNodeApi->addNodeEventReceiver(stack, [](ArkUI_NodeEvent* event){
- // process event
- });
- arkUINativeNodeApi->registerNodeEvent(stack, NODE_ON_CLICK, 0, nullptr);
获取NDK接口支持的事件范围可以通过查询ArkUI_NodeEventType枚举值。
示例
下面的示例展示了如何使用ContentSlot挂载Native侧的文本列表。
图1 Native文本列表

-
在ArkTS页面上声明用于Native页面挂载的占位组件,并在页面创建时通知Native侧创建文本列表。
- import nativeNode from 'libentry.so';
- import { NodeContent } from '@kit.ArkUI';
- @Entry
- @Component
- struct Index {
- // 初始化NodeContent对象。
- private rootSlot = new NodeContent();
- @State @Watch('changeNativeFlag') showNative: boolean = false;
- changeNativeFlag(): void {
- if (this.showNative) {
- // 传递NodeContent对象用于Native创建组件的挂载显示
- nativeNode.createNativeRoot(this.rootSlot)
- } else {
- // 销毁NativeModule组件
- nativeNode.destroyNativeRoot()
- }
- }
- build() {
- Column() {
- Button(this.showNative ? "HideNativeUI" : "ShowNativeUI").onClick(() => {
- this.showNative = !this.showNative
- })
- Row() {
- // 将NodeContent和ContentSlot占位组件绑定。
- ContentSlot(this.rootSlot)
- }.layoutWeight(1)
- }
- .width('100%')
- .height('100%')
- }
- }
-
使用Native模板创建工程,并在Native侧提供Node-API的桥接方法,实现ArkTS侧的NativeNode模块接口。
接口声明。
- // entry/src/main/cpp/types/libentry/Index.d.ts
- export const createNativeRoot: (content: Object) => void;
- export const destroyNativeRoot: () => void;
Native实现。
- // entry/src/main/cpp/napi_init.cpp
- #include "napi/native_api.h"
- #include "NativeEntry.h"
- EXTERN_C_START
- static napi_value Init(napi_env env, napi_value exports) {
- // 绑定Native侧的创建组件和销毁组件。
- napi_property_descriptor desc[] = {
- {"createNativeRoot", nullptr, NativeModule::CreateNativeRoot, nullptr, nullptr, nullptr, napi_default, nullptr},
- {"destroyNativeRoot", nullptr, NativeModule::DestroyNativeRoot, 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 = "entry",
- .nm_priv = ((void *)0),
- .reserved = {0},
- };
- extern "C" __attribute__((constructor)) void RegisterEntryModule(void) { napi_module_register(&demoModule); }
更多推荐



所有评论(0)