在 N-API 中直接从一个函数向另一个函数传递参数稍微有点复杂,因为你需要正确地处理 napi_value
数组和环境 (napi_env
)。如果你想在一个 N-API 函数 (CallAddFunction
) 中构造参数并直接调用另一个 N-API 函数 (GetAddCheckArg
),并且管理这些参数的传递,你将需要手动构建一个新的 napi_callback_info
或者简化参数的直接传递方式。
由于 N-API 不直接支持构造 napi_callback_info
(这是一个内部结构,通常由 Node.js 的引擎在调用回调时自动填充),我们通常会通过简化方法:直接构建参数数组并通过封装的函数接口直接传递。我们可以重新设计 GetAddCheckArg
,使其接受 napi_env
和参数数组,而不是通过 napi_callback_info
。
1. 修改 GetAddCheckArg
接收 napi_env
和 napi_value
数组
这种方式需要修改 GetAddCheckArg
的签名,以便它能够直接接收参数数组和参数数量。
#include <node_api.h>
#include <assert.h>
napi_value GetAddCheckArg(napi_env env, size_t argc, napi_value* argv) {
if (argc < 2) {
napi_throw_type_error(env, NULL, "Function expects two arguments");
return NULL;
}
int32_t num1, num2;
napi_status status = napi_get_value_int32(env, argv[0], &num1);
assert(status == napi_ok);
status = napi_get_value_int32(env, argv[1], &num2);
assert(status == napi_ok);
napi_value result;
int32_t sum = num1 + num2;
status = napi_create_int32(env, sum, &result);
assert(status == napi_ok);
return result;
}
2. 在 CallAddFunction
中调用修改后的 GetAddCheckArg
napi_value CallAddFunction(napi_env env, napi_callback_info info) {
napi_value args[2];
napi_status status;
// 创建两个整数 napi_value
status = napi_create_int32(env, 5, &args[0]);
assert(status == napi_ok);
status = napi_create_int32(env, 10, &args[1]);
assert(status == napi_ok);
// 调用 GetAddCheckArg 并直接传递参数数组
napi_value result = GetAddCheckArg(env, 2, args);
return result;
}
3. 注册这些函数到 Node.js 模块
你需要更新初始化函数以注册 CallAddFunction
:
napi_value Init(napi_env env, napi_value exports) {
napi_status status;
napi_value fn1, fn2;
status = napi_create_function(env, "add", NAPI_AUTO_LENGTH, GetAddCheckArg, NULL, &fn1);
assert(status == napi_ok);
status = napi_set_named_property(env, exports, "add", fn1);
assert(status == napi_ok);
status = napi_create_function(env, "callAdd", NAPI_AUTO_LENGTH, CallAddFunction, NULL, &fn2);
assert(status == napi_ok);
status = napi_set_named_property(env, exports, "callAdd", fn2);
assert(status == napi_ok);
return exports;
}
这样,你就可以在 Node.js 环境中直接调用 CallAddFunction
,它会进一步调用 GetAddCheckArg
。