简介
扩展能力接口 进一步扩展了Node-API的功能,提供了一些额外的接口,用于在Node-API模块中与ArkTS进行更灵活的交互和定制,这些接口可以用于创建自定义ArkTS对象等场景。
Node-API接口开发流程参考使用Node-API实现跨语言交互开发流程,本文仅对接口对应C++及ArkTS相关代码进行展示。
模块加载
接口描述
接口 | 描述 |
---|---|
napi_load_module | 用于在Node-API模块中将abc文件作为模块加载,返回模块的命名空间,适用于需要在运行时动态加载模块或资源的应用程序,从而实现灵活的扩展和定制。 |
napi_load_module_with_info | 用于在Node-API中进行模块的加载,当模块加载出来之后,可以使用函数napi_get_property获取模块导出的变量,也可以使用napi_get_named_property获取模块导出的函数,该函数可以在新创建的ArkTs基础运行时环境中使用 |
napi_module_register | 有些功能可能需要通过Node-API模块来实现以获得更好的性能,通过将这些功能实现为自定义模块并注册到ArkTS环境中,可以在一定程度上提高整体的性能。 |
使用示例
napi_load_module
使用Node-API接口在主线程中进行模块加载
napi_load_module_with_info
使用Node-API接口进行模块加载
napi_module_register
在ArkTS代码环境中使用Node-API模块编写的代码来实现特定的功能,可以将这部分功能封装成自定义模块,然后通过napi_module_register将其注册到ArkTS代码环境中,以实现功能的扩展和复用。
cpp部分代码
#include "napi/native_api.h"
// 此模块是一个Node-API的回调函数
static napi_value Add(napi_env env, napi_callback_info info)
{
// 接受传入两个参数
size_t requireArgc = 2;
size_t argc = 2;
napi_value args[2] = {nullptr};
napi_get_cb_info(env, info, &argc, args , nullptr, nullptr);
// 将传入的napi_value类型的参数转化为double类型
double valueLift;
double valueRight;
napi_get_value_double(env, args[0], &valueLift);
napi_get_value_double(env, args[1], &valueRight);
// 将转化后的double值相加并转成napi_value返回给ArkTS代码使用
napi_value sum;
napi_create_double(env, valueLift + valueRight, &sum);
return sum;
}
// C++函数Init用于初始化插件,用于将ArkTS层的函数或属性与C++层的函数进行关联
EXTERN_C_START
static napi_value Init(napi_env env, napi_value exports)
{
// 通过napi_property_descriptor结构体,可以定义需要导出的属性,并在Node-API模块中使用。napi_define_properties将属性与实际的C++函数进行关联,使其可以被ArkTS层访问和调用
napi_property_descriptor desc[] = {
{ "add", nullptr, Add, nullptr, nullptr, nullptr, napi_default, nullptr }
};
napi_define_properties(env, exports, sizeof(desc) / sizeof(desc[0]), desc);
return exports;
}
EXTERN_C_END
// 插件的初始化被定义在一个名为demoModule的结构体中,其中包含了模块的基本信息,比如模块的版本号、注册函数等
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 },
};
// 在RegisterEntryModule函数中,使用napi_module_register函数注册并导出了这个插件
extern "C" __attribute__((constructor)) void RegisterEntryModule(void)
{
napi_module_register(&demoModule);
}
接口声明
// index.d.ts
export const add: (a: number, b: number) => number;
ArkTS侧示例代码
import hilog from '@ohos.hilog'
import testNapi from 'libentry.so'
hilog.info(0x0000, 'testTag', 'Test Node-API 2 + 3 = %{public}d', testNapi.add(2, 3));
ArkTS Object相关
接口描述
接口 | 描述 |
---|---|
napi_create_object_with_properties | 用于在Node-API模块中使用给定的napi_property_descriptor创建ArkTS Object。descriptor的键名必须为string,且不可转为number。 |
napi_create_object_with_named_properties | 用于在Node-API模块中使用给定的napi_value和键名创建ArkTS Object。键名必须为string,且不可转为number。 |
使用示例
napi_create_object_with_properties
用于使用给定的napi_property_descriptor作为属性去创建一个ArkTS对象,并且descriptor的键名必须为string,且不可转为number。
cpp部分代码
#include "napi/native_api.h"
static napi_value CreateObjectWithProperties(napi_env env, napi_callback_info info)
{
size_t argc = 1;
napi_value argv[1] = nullptr;
// 获取解析传递的参数
napi_get_cb_info(env, info, &argc, argv, nullptr, nullptr);
// 声明了一个napi_property_descriptor数组desc,其中包含了一个名为"name"的属性,其值为传入的第一个参数argv[0]。
napi_property_descriptor desc[] = {
{"name", nullptr, nullptr, nullptr, nullptr, argv[0], napi_default_jsproperty, nullptr}};
napi_value object = nullptr;
// 调用napi_create_object_with_properties来创建一个新的ArkTS对象,并将属性值添加到该对象中。
napi_create_object_with_properties(env, &object, sizeof(desc) / sizeof(desc[0]), desc);
napi_valuetype valueType;
napi_typeof(env, object, &valueType);
if (valueType == napi_object) {
return object;
}
}
接口声明
// index.d.ts
export const createObjectWithProperties: (data: string) => Object;
ArkTS侧示例代码
import hilog from '@ohos.hilog'
import testNapi from 'libentry.so'
let value = testNapi.createObjectWithProperties('createObject');
hilog.info(0x0000, 'testTag', 'Node-API napi_create_object_with_properties:%{public}s', JSON.stringify(value));
napi_create_object_with_named_properties
用于使用给定的napi_value和键名创建一个ArkTS对象,并且给定的键名必须为string,且不可转为number。
cpp部分代码
#include "napi/native_api.h"
static napi_value CreateObjectWithNameProperties(napi_env env, napi_callback_info info)
{
size_t argc = 1;
napi_value argv[1] = nullptr;
// 获取解析传递的参数
napi_get_cb_info(env, info, &argc, argv, nullptr, nullptr);
napi_value obj = nullptr;
const char *key[] = {
"name",
};
const napi_value values[] = {
argv[0],
};
napi_property_descriptor desc[] = {
{"name", nullptr, nullptr,
nullptr, nullptr, nullptr, napi_default, nullptr}};
napi_status status;
status = napi_create_object_with_named_properties(env, &obj, sizeof(desc) / sizeof(desc[0]), key, values);
if (status != napi_ok) {
return argv[0];
}
return obj;
}
接口声明
// index.d.ts
export const createObjectWithNameProperties: (data: string) => string | { name: string };
ArkTS侧示例代码
import hilog from '@ohos.hilog'
import testNapi from 'libentry.so'
let value = testNapi.createObjectWithNameProperties('ls');
hilog.info(0x0000, 'testTag', 'Node-API napi_create_object_with_named_properties:%{public}s', JSON.stringify(value));
运行指定abc文件
接口描述
接口 | 描述 |
---|---|
napi_run_script_path | 用于在Node-API模块中运行指定abc文件。 |