HarmonyOS 鸿蒙Next:js的function传递给c后,怎么在c的子线程使用该function
HarmonyOS 鸿蒙Next:js的function传递给c后,怎么在c的子线程使用该function js的function传递给c后,怎么在c的子线程使用该function
当C创建了其他的线程,创建的其他的线程不能直接调用arkts侧的函数,必须要跟C主线程通信,然后通过主线程来调用ts回调函数。 请参照下面的代码,通过C++子线程调用arkts侧的函数
JS侧传入回调函数
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函数,并且可以从多个线程调用。
更多关于HarmonyOS 鸿蒙Next:js的function传递给c后,怎么在c的子线程使用该function的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html
在HarmonyOS鸿蒙系统中,当使用JS(JavaScript)的function传递给C代码后,在C的子线程中使用该function涉及几个关键步骤。由于鸿蒙系统通常使用ArkUI(包含JS框架)与原生C/C++代码进行交互,以下是一个简化的流程说明:
-
封装JS Function:在JS中,将需要传递给C的函数封装为一个对象或全局变量,确保该函数可以被访问。
-
通过JNI/JSI接口传递:鸿蒙系统可能提供了类似于Android的JNI(Java Native Interface)或React Native的JSI接口来允许JS与原生代码通信。通过这些接口,将JS函数引用传递给C代码。
-
在C中存储并调用:在C代码中,接收这个JS函数引用,并存储在一个全局或线程安全的数据结构中。为了在线程中使用,需要确保线程安全,并正确处理JS执行环境(如ArkUI的JS上下文)。
-
在子线程中执行:在C的子线程中,通过之前存储的引用调用JS函数。这通常涉及到同步机制来确保JS执行环境的正确性,并处理可能的线程间通信问题。
请注意,由于鸿蒙系统的具体实现细节可能有所不同,上述步骤需要根据实际开发环境和鸿蒙SDK的具体API进行调整。
如果问题依旧没法解决请联系官网客服,官网地址是 https://www.itying.com/category-93-b0.html,