1# 使用Node-API接口关联数据,使其生命周期与当前环境的生命周期相关联 2<!--Kit: NDK--> 3<!--Subsystem: arkcompiler--> 4<!--Owner: @xliu-huanwei; @shilei123; @huanghello--> 5<!--Designer: @shilei123--> 6<!--Tester: @kirl75; @zsw_zhushiwei--> 7<!--Adviser: @fang-jinxu--> 8 9## 简介 10 11在Node-API模块中,可以使用Node-API接口将特定数据与当前环境相关联,并在需要时检索该数据。 12 13## 基本概念 14 15在Node-API中,关联数据指的是将自定义的C++数据结构与当前环境的生命周期绑定,这意味着只要当前运行环境存在,关联数据就会保持有效。 16 17## 场景和功能介绍 18 19以下接口可在Node-API模块中更方便地管理对象实例所需的状态信息、引用计数或其他自定义数据,他们的使用场景如下: 20| 接口 | 描述 | 21| -------- | -------- | 22| napi_set_instance_data | 绑定与当前运行的环境相关联的数据项。 | 23| napi_get_instance_data | 检索与当前运行的环境相关联的数据项。 | 24 25## 使用示例 26 27Node-API接口开发流程参考[使用Node-API实现跨语言交互开发流程](use-napi-process.md),本文仅对接口对应C++及ArkTS相关代码进行展示。 28 29### napi_set_instance_data 30 31将需要绑定的数据与当前运行的环境相关联。 32 33cpp部分代码 34 35```cpp 36#include <cstdlib> 37#include "napi/native_api.h" 38 39// 定义一个结构来存储实例数据 40struct InstanceData { 41 int32_t value; 42}; 43 44// 对象被释放时的回调函数,用于清理实例数据 45void FinalizeCallback(napi_env env, void *finalize_data, void *finalize_hint) 46{ 47 if (finalize_data) { 48 InstanceData *data = reinterpret_cast<InstanceData *>(finalize_data); 49 // 释放内存,清除指针指向地址 50 delete (data); 51 } 52} 53 54static napi_value SetInstanceData(napi_env env, napi_callback_info info) 55{ 56 size_t argc = 1; 57 napi_value argv[1]; 58 napi_get_cb_info(env, info, &argc, argv, nullptr, nullptr); 59 int32_t instanceDataValue; 60 napi_get_value_int32(env, argv[0], &instanceDataValue); 61 InstanceData *instanceData = new InstanceData; 62 instanceData->value = instanceDataValue; 63 // 调用napi_set_instance_data将实例数据关联到Node-API环境,并指定FinalizeCallback函数 64 napi_status status = napi_set_instance_data(env, instanceData, FinalizeCallback, nullptr); 65 bool success = true; 66 napi_value result = nullptr; 67 if (status == napi_ok) { 68 napi_get_boolean(env, success, &result); 69 } 70 return result; 71} 72``` 73<!-- @[napi_set_instance_data](https://gitcode.com/openharmony/applications_app_samples/blob/master/code/DocsSample/ArkTS/NodeAPI/NodeAPIUse/NodeAPIEnvironmentalLifeCycle/entry/src/main/cpp/napi_init.cpp) --> 74 75接口声明 76 77```ts 78// index.d.ts 79export const setInstanceData: (data: number) => boolean; 80``` 81<!-- @[napi_set_instance_data_api](https://gitcode.com/openharmony/applications_app_samples/blob/master/code/DocsSample/ArkTS/NodeAPI/NodeAPIUse/NodeAPIEnvironmentalLifeCycle/entry/src/main/cpp/types/libentry/Index.d.ts) --> 82 83ArkTS侧示例代码 84 85```ts 86import { hilog } from '@kit.PerformanceAnalysisKit'; 87import testNapi from 'libentry.so'; 88let data = 5; 89let value = testNapi.setInstanceData(data); 90hilog.info(0x0000, 'testTag', 'Test Node-API napi_set_instance_data:%{public}s', value); 91``` 92<!-- @[ark_napi_set_instance_data](https://gitcode.com/openharmony/applications_app_samples/blob/master/code/DocsSample/ArkTS/NodeAPI/NodeAPIUse/NodeAPIEnvironmentalLifeCycle/entry/src/main/ets/pages/Index.ets) --> 93 94### napi_get_instance_data 95 96检索与当前运行的环境相关联的数据项。 97 98cpp部分代码 99 100```cpp 101#include "napi/native_api.h" 102 103static napi_value GetInstanceData(napi_env env, napi_callback_info info) { 104 InstanceData *resData = nullptr; 105 // napi_get_instance_data获取之前想关联的数据项 106 napi_status status = napi_get_instance_data(env, (void **)&resData); 107 if (status != napi_ok) { 108 return nullptr; 109 } 110 napi_value result; 111 napi_create_int32(env, resData->value, &result); 112 return result; 113} 114``` 115<!-- @[napi_get_instance_data](https://gitcode.com/openharmony/applications_app_samples/blob/master/code/DocsSample/ArkTS/NodeAPI/NodeAPIUse/NodeAPIEnvironmentalLifeCycle/entry/src/main/cpp/napi_init.cpp) --> 116 117接口声明 118 119```ts 120// index.d.ts 121export const getInstanceData: () => number | undefined; 122``` 123<!-- @[napi_get_instance_data_api](https://gitcode.com/openharmony/applications_app_samples/blob/master/code/DocsSample/ArkTS/NodeAPI/NodeAPIUse/NodeAPIEnvironmentalLifeCycle/entry/src/main/cpp/types/libentry/Index.d.ts) --> 124 125ArkTS侧示例代码 126 127```ts 128import { hilog } from '@kit.PerformanceAnalysisKit'; 129import testNapi from 'libentry.so'; 130let data = 5; 131testNapi.setInstanceData(data); 132let value = testNapi.getInstanceData(); 133hilog.info(0x0000, 'testTag', 'Test Node-API napi_set_instance_data:%{public}d', value); 134``` 135<!-- @[ark_napi_get_instance_data](https://gitcode.com/openharmony/applications_app_samples/blob/master/code/DocsSample/ArkTS/NodeAPI/NodeAPIUse/NodeAPIEnvironmentalLifeCycle/entry/src/main/ets/pages/Index.ets) --> 136 137以上代码如果要在native cpp中打印日志,需在CMakeLists.txt文件中添加以下配置信息(并添加头文件:#include "hilog/log.h"): 138 139```text 140// CMakeLists.txt 141add_definitions( "-DLOG_DOMAIN=0xd0d0" ) 142add_definitions( "-DLOG_TAG=\"testTag\"" ) 143target_link_libraries(entry PUBLIC libace_napi.z.so libhilog_ndk.z.so) 144``` 145