当C创建了其他的线程,创建的其他的线程不能直接调用ArkTS侧的函数,必须要跟C主线程通信,然后通过主线程来调用ArkTS回调函数。参照如下代码:ArkTS侧传入回调函数:Text(this.message) .onClick(() => { testNapi.threadSafeTest((value) => { hilog.info(0x0000, 'testTag', 'js callback value = ' + value); }) })Native侧主线程中创建线程安全函数:napi_ref cbObj = nullptr; napi_threadsafe_function tsfn; #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 ThreadSafeTest(napi_env env, napi_callback_info info) { size_t argc = 1; napi_value js_cb, work_name; napi_status status; napi_get_cb_info(env, info, &argc, &js_cb, nullptr, nullptr); status = napi_create_reference(env, js_cb, 1, &cbObj); OH_LOG_INFO(LOG_APP, " ThreadSafeTest 0 : %{public}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 : %{public}d", status == napi_ok); status = napi_create_string_utf8(env, "Node-API Thread-safe call from Async 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 : %{public}d", status == napi_ok); std::thread t( { std::thread::id this_id = std::this_thread::get_id(); OH_LOG_INFO(LOG_APP, "thread0 %{public}s.\n", this_id); napi_status status; status = napi_acquire_threadsafe_function(tsfn); OH_LOG_INFO(LOG_APP, "thread : %{public}d", status == napi_ok); napi_call_threadsafe_function(tsfn, NULL, napi_tsfn_blocking); }); t.detach(); return nullptr; }上面代码中,ArkTS调用ThreadsTest方法,通过napi_create_threadsafe_function() 创建了一个NAPI对象,该对象包含一个ArkTS函数,并且可以从多个线程调用。
当C创建了其他的线程,创建的其他的线程不能直接调用ArkTS侧的函数,必须要跟C主线程通信,然后通过主线程来调用ArkTS回调函数。
参照如下代码:
ArkTS侧传入回调函数:
Native侧主线程中创建线程安全函数:
上面代码中,ArkTS调用ThreadsTest方法,通过napi_create_threadsafe_function() 创建了一个NAPI对象,该对象包含一个ArkTS函数,并且可以从多个线程调用。