# 使用Node-API接å£å…³è”æ•°æ®ï¼Œä½¿å…¶ç”Ÿå‘½å‘¨æœŸä¸Žå½“å‰çŽ¯å¢ƒçš„ç”Ÿå‘½å‘¨æœŸç›¸å…³è” ## 简介 在Node-API模å—ä¸ï¼Œæˆ‘们å¯ä»¥ä½¿ç”¨Node-API接å£å°†ç‰¹å®šæ•°æ®ä¸Žå½“å‰çš„环境相关è”ï¼Œå¹¶åœ¨éœ€è¦æ—¶æ£€ç´¢è¯¥æ•°æ®ã€‚ ## 基本概念 在Node-APIä¸çš„å…³è”æ•°æ®æ˜¯æŒ‡å°†è‡ªå®šä¹‰çš„C++æ•°æ®ç»“构的生命周期与当å‰çŽ¯å¢ƒçš„ç”Ÿå‘½å‘¨æœŸç›¸å…³è”,这æ„味ç€åªè¦å½“å‰è¿è¡ŒçŽ¯å¢ƒå˜åœ¨ï¼Œå…³è”æ•°æ®å°±ä¼šä¿æŒæœ‰æ•ˆã€‚ ## åœºæ™¯å’ŒåŠŸèƒ½ä»‹ç» ä»¥ä¸‹æŽ¥å£å¯ä»¥å¸®åŠ©æˆ‘ä»¬åœ¨Node-API模å—䏿›´æ–¹ä¾¿åœ°ç®¡ç†å¯¹è±¡å®žä¾‹æ‰€éœ€çš„状æ€ä¿¡æ¯ã€å¼•用计数或其他自定义数æ®ï¼Œä»–们的使用场景如下: | æŽ¥å£ | æè¿° | | -------- | -------- | | napi_set_instance_data | 绑定与当å‰è¿è¡Œçš„环境相关è”的数æ®é¡¹ã€‚ | | napi_get_instance_data | 检索与当å‰è¿è¡Œçš„环境相关è”的数æ®é¡¹ã€‚ | ## 使用示例 Node-API接å£å¼€å‘æµç¨‹å‚考[使用Node-API实现跨è¯è¨€äº¤äº’开呿µç¨‹](use-napi-process.md),本文仅对接å£å¯¹åº”C++åŠArkTS相关代ç 进行展示。 ### napi_set_instance_data 将需è¦ç»‘定的数æ®ä¸Žå½“å‰è¿è¡Œçš„环境相关è”。 cpp部分代ç ```cpp #include <cstdlib> #include "napi/native_api.h" // 定义一个结构æ¥å˜å‚¨å®žä¾‹æ•°æ® struct InstanceData { int32_t value; }; // 对象被释放时的回调函数,用于清ç†å®žä¾‹æ•°æ® void FinalizeCallback(napi_env env, void *finalize_data, void *finalize_hint) { if (finalize_data) { InstanceData *data = reinterpret_cast<InstanceData *>(finalize_data); // 释放内å˜ï¼Œæ¸…除指针指å‘åœ°å€ delete (data); *(InstanceData **)finalize_data = nullptr; } } static napi_value SetInstanceData(napi_env env, napi_callback_info info) { size_t argc = 1; napi_value argv[1]; napi_get_cb_info(env, info, &argc, argv, nullptr, nullptr); int32_t instanceDataValue; napi_get_value_int32(env, argv[0], &instanceDataValue); InstanceData *instanceData = new InstanceData; instanceData->value = instanceDataValue; // 调用napi_set_instance_data将实例数æ®å…³è”到Node-API环境,并指定FinalizeCallback函数 napi_status status = napi_set_instance_data(env, instanceData, FinalizeCallback, nullptr); bool success = true; napi_value result; if (status == napi_ok) { napi_get_boolean(env, success, &result); } return result; } ``` 接å£å£°æ˜Ž ```ts // index.d.ts export const setInstanceData: (data: number) => boolean; ``` ArkTS侧示例代ç ```ts import hilog from '@ohos.hilog' import testNapi from 'libentry.so' let data = 5; let value = testNapi.setInstanceData(data); hilog.info(0x0000, 'testTag', 'Test Node-API napi_set_instance_data:%{public}s', value); ``` ### napi_get_instance_data 检索出与当å‰è¿è¡Œçš„环境相关è”的数æ®é¡¹ã€‚ cpp部分代ç ```cpp #include "napi/native_api.h" static napi_value GetInstanceData(napi_env env, napi_callback_info info) { InstanceData *resData = nullptr; // napi_get_instance_data获å–之剿ƒ³å…³è”的数æ®é¡¹ napi_get_instance_data(env, (void **)&resData); napi_value result; napi_create_int32(env, resData->value, &result); return result; } ``` 接å£å£°æ˜Ž ```ts // index.d.ts export const getInstanceData: () => number; ``` ArkTS侧示例代ç ```ts import hilog from '@ohos.hilog' import testNapi from 'libentry.so' let data = 5; testNapi.setInstanceData(data); let value = testNapi.getInstanceData(); hilog.info(0x0000, 'testTag', 'Test Node-API napi_set_instance_data:%{public}d', value); ``` 以上代ç 如果è¦åœ¨native cpp䏿‰“å°æ—¥å¿—,需在CMakeLists.txtæ–‡ä»¶ä¸æ·»åР以䏋é…置信æ¯ï¼ˆå¹¶æ·»åŠ å¤´æ–‡ä»¶ï¼š#include "hilog/log.h"): ```text // CMakeLists.txt add_definitions( "-DLOG_DOMAIN=0xd0d0" ) add_definitions( "-DLOG_TAG=\"testTag\"" ) target_link_libraries(entry PUBLIC libhilog_ndk.z.so) ```