HarmonyOS鸿蒙Next中node-api是不是只能在js主线程中执行 在C++开辟一个子线程 子线程中是不是不能调用node-api的接口
HarmonyOS鸿蒙Next中node-api是不是只能在js主线程中执行 在C++开辟一个子线程 子线程中是不是不能调用node-api的接口 node-api是不是只能在js主线程中执行?在C++开辟一个子线程,子线程中是不是不能调用node-api的接口?
当C创建了其他的线程,创建的其他的线程不能直接调用arkts侧的函数,必须要跟C主线程通信,然后通过主线程来调用ts回调函数
请参照下面的代码,通过C++子线程调用arkts侧的函数
#define NUMBER 666
static void CallJs(napi_env env, napi_value js_cb, void *context, void *data) {
napi_get_reference_value(env, cbObj, &js_cb);
napi_value argv;
napi_create_int32(env, NUMBER, &argv);
napi_value result = nullptr;
napi_call_function(env, nullptr, js_cb, 1, &argv, &result);
}
static napi_value ThreadsTest(napi_env env, napi_callback_info info) {
size_t argc = 1;
napi_value js_cb, work_name;
napi_status status;
status = napi_get_cb_info(env, info, &argc, &js_cb, nullptr, nullptr);
OH_LOG_INFO(LOG_APP, "ThreadSafeTest 0: %d", status == napi_ok);
// Set initial_refcount to 0 for a weak reference, >0 for a strong reference.
status = napi_create_reference(env, js_cb, 1, &cbObj);
OH_LOG_INFO(LOG_APP, "napi_create_reference of js_cb to cbObj: %d", status == napi_ok);
status = napi_create_string_utf8(env, "Work Item", NAPI_AUTO_LENGTH, &work_name);
status = napi_create_threadsafe_function(env, js_cb, NULL, work_name, 0, 1, NULL, NULL, NULL, CallJs, &tsfn);
OH_LOG_INFO(LOG_APP, "napi_create_threadsafe_function : %d", status == napi_ok);
std::thread t ({
std::thread::id this_id = std::this_thread::get_id();
OH_LOG_INFO(LOG_APP, "thread0 %d.\n", this_id);
napi_status status;
status = napi_acquire_threadsafe_function(tsfn);
OH_LOG_INFO(LOG_APP, "thread : %d", status == napi_ok);
napi_call_threadsafe_function(tsfn, NULL, napi_tsfn_blocking);
});
t.detach();
return NULL;
}
更多关于HarmonyOS鸿蒙Next中node-api是不是只能在js主线程中执行 在C++开辟一个子线程 子线程中是不是不能调用node-api的接口的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html
在HarmonyOS鸿蒙Next中,node-api
的设计初衷是为了在JavaScript环境中进行原生模块的扩展和调用。根据鸿蒙的文档和API设计,node-api
的接口确实主要在JavaScript主线程中执行。这是因为node-api
与JavaScript引擎的上下文紧密相关,而JavaScript引擎通常运行在主线程中。
在C++中开辟的子线程中,直接调用node-api
接口是不被支持的。原因在于node-api
依赖于JavaScript引擎的上下文,而子线程通常不具备与主线程相同的JavaScript环境。如果需要在子线程中与JavaScript交互,通常需要通过线程间通信机制(如消息队列或事件循环)将任务传递回主线程,再由主线程调用node-api
接口。
总结来说,node-api
接口在C++子线程中不能直接调用,必须通过主线程的JavaScript上下文来执行。
在HarmonyOS鸿蒙Next中,Node-API 接口通常只能在 JavaScript 主线程中执行。如果你在 C++ 中创建了一个子线程,直接在该子线程中调用 Node-API 接口可能会导致未定义行为或崩溃。如果需要在子线程中与 JavaScript 交互,建议通过主线程进行通信,或者使用适当的线程安全机制。