1# 使用Node-API接口关于其他实用工具 2 3## 简介 4 5Node-API接口提供了一些实用接口,可以帮助开发者更好地进行Node-API相关开发。 6 7## 基本概念 8 9- **模块加载:** 在Node-API模块中,模块是指包含特定功能的ArkTS文件,通过import导入lib共享库中的模块。了解Node-API模块中的加载机制以及模块之间的依赖关系对于理解node_api_get_module_file_name接口的使用很有帮助。 10- **文件路径和URL:** node_api_get_module_file_name返回的是加载项的绝对路径的URL。 11- **比较ArkTS值严格相等:** 比较两个ArkTS值是否严格相等。严格相等比较不会进行类型转换,它要求两个值的类型和值完全相同才会返回true。 12- **处理异步操作:**:通过Libuv可以实现异步操作,避免阻塞主线程,使得程序可以同时执行多个任务而不会出现阻塞现象。 13- **实现事件循环:**:Libuv提供了事件循环机制,可以处理事件、触发回调函数,并管理事件队列,使得Node-API模块能够实现事件驱动的编程模型。 14 15## 场景和功能介绍 16 17| 接口 | 描述 | 18| -------- | -------- | 19| node_api_get_module_file_name | 获取加载项加载位置的绝对路径。 | 20| napi_strict_equals | 在某些情况下,希望确保两个值不仅具有相同的值,还具有相同的类型。例如,如果正在处理一些需要特定类型的数据结构或算法,使用napi_strict_equals可以确保数据的一致性。 | 21 22## 使用示例 23 24Node-API接口开发流程参考[使用Node-API实现跨语言交互开发流程](use-napi-process.md),本文仅对接口对应C++及ArkTS相关代码进行展示。 25 26### node_api_get_module_file_name 27 28用于获取加载项加载位置的绝对路径。 29 30cpp部分代码 31 32```cpp 33#include "napi/native_api.h" 34 35static napi_value GetModuleFileName(napi_env env, napi_callback_info info) 36{ 37 // 声明一个const char类型的指针变量file,用于存储模块绝对路径 38 const char *file = nullptr; 39 napi_value value = nullptr; 40 // 获取当前模块的绝对路径,并将结果存储在file变量中 41 napi_status status = node_api_get_module_file_name(env, &file); 42 if (status != napi_ok) { 43 napi_throw_error(env, nullptr, "Failed to get module file name"); 44 return nullptr; 45 } 46 // 创建一个包含绝对路径的napi_value类型的字符串 47 napi_create_string_utf8(env, file, NAPI_AUTO_LENGTH, &value); 48 return value; 49} 50``` 51 52接口声明 53 54```ts 55// index.d.ts 56export const getModuleFileName: () => string | void; 57``` 58 59ArkTS侧示例代码 60 61```ts 62import hilog from '@ohos.hilog' 63import testNapi from 'libentry.so' 64 65let filename = testNapi.getModuleFileName(); 66hilog.info(0x0000, 'testTag', 'Test Node-API node_api_get_module_file_name:%{public}s', filename); 67``` 68 69### napi_strict_equals 70 71判断给定的两个ArkTS value是否严格相等。 72 73cpp部分代码 74 75```cpp 76#include "napi/native_api.h" 77 78static napi_value StrictEquals(napi_env env, napi_callback_info info) 79{ 80 // 接受两个入参 81 size_t argc = 2; 82 napi_value args[2] = {nullptr}; 83 napi_get_cb_info(env, info, &argc, args, nullptr, nullptr); 84 // 调用napi_strict_equals接口判断给定的两个ArkTS value是否严格相等 85 bool result = true; 86 napi_status status = napi_strict_equals(env, args[0], args[1], &result); 87 if (status != napi_ok) { 88 napi_throw_error(env, nullptr, "Node-API napi_get_cb_info fail"); 89 return nullptr; 90 } 91 // 将结果转成napi_value类型返回 92 napi_value returnValue = nullptr; 93 napi_get_boolean(env, result, &returnValue); 94 return returnValue; 95} 96``` 97 98接口声明 99 100```ts 101// index.d.ts 102export const strictEquals : (lhs: string, rhs: string | number) => boolean | void; 103``` 104 105ArkTS侧示例代码 106 107```ts 108import hilog from '@ohos.hilog' 109import testNapi from 'libentry.so' 110try { 111 let lhs = "123"; 112 let rhs = "123"; 113 let str = "456"; 114 let num = 123; 115 hilog.info(0x0000, 'testTag', 'Test Node-API napi_strict_equals: %{public}s', testNapi.strictEquals(lhs, rhs)); 116 hilog.info(0x0000, 'testTag', 'Test Node-API napi_strict_equals: %{public}s', testNapi.strictEquals(lhs, str)); 117 hilog.info(0x0000, 'testTag', 'Test Node-API napi_strict_equals: %{public}s', testNapi.strictEquals(lhs, num)); 118} catch (error) { 119 hilog.error(0x0000, 'testTag', 'Test Node-API napi_strict_equals error: %{public}s', error.message); 120 121} 122``` 123 124以上代码如果要在native cpp中打印日志,需在CMakeLists.txt文件中添加以下配置信息(并添加头文件:#include "hilog/log.h"): 125 126```text 127// CMakeLists.txt 128add_definitions( "-DLOG_DOMAIN=0xd0d0" ) 129add_definitions( "-DLOG_TAG=\"testTag\"" ) 130target_link_libraries(entry PUBLIC libhilog_ndk.z.so) 131``` 132