NAPI执行上层回调时,如何获取env
在使用 Node.js 的 N-API(Node.js Addon API)执行上层回调时,env
通常指的是 N-API 环境,它包含了与 V8 引擎交互所需的所有函数和数据结构。当你执行上层回调时,你通常需要传递 env
以便在回调函数中访问 Node.js 的运行时环境。
为了在执行上层回调时获取 env
,你需要确保在调用回调函数之前将其作为参数传递。通常,在编写一个 N-API 插件时,你会在插件的初始化函数中创建一个上下文(context),并将 env
作为该上下文的一部分。然后,当你需要执行一个上层回调时,你可以从这个上下文中检索 env
并将其传递给回调函数。
这里是一个简化的示例,展示了如何在 N-API 中执行上层回调并传递 env
:
#include <node_api.h>
// 假设这是你的上层回调函数
void upperLayerCallback(napi_env env, void* data) {
// 在这里你可以使用 env 来访问 N-API 的功能
// ...
}
// 插件的初始化函数
napi_value Init(napi_env env, napi_value exports) {
// 创建一个上下文,并将 env 保存到其中
// ...
// 假设你有一个需要执行上层回调的函数
void* callbackData = /* ... */;
// 执行上层回调,传递 env 和其他数据
upperLayerCallback(env, callbackData);
// ...
return exports;
}
NAPI_MODULE(NODE_GYP_MODULE_NAME, Init)
在这个示例中,upperLayerCallback
是你的上层回调函数,它接受一个 napi_env
参数来访问 N-API 功能。在插件的初始化函数 Init
中,你创建了一个上下文(虽然这里没有显式显示),并在执行上层回调时从该上下文中检索 env
,然后将其传递给 upperLayerCallback
。
请注意,这个示例是非常简化的,实际的实现可能会更复杂,具体取决于你的插件的具体需求。此外,确保在回调函数中正确地处理 env
,避免在不应该的时候释放或修改它。
libuv处理方式是在注册JS回调时保存env。在callback中从env中获取对应的JS线程的loop,再调用libuv接口抛JS任务到loop中执行。
napi_create_thread_safe_function
函数调用是会触发参数中的napi_threadsafe_function_call_js
函数,该函数可以获取env在js线程中执行,可参考如下方式: