HarmonyOS鸿蒙Next中native侧中子线程如何使用JS函数

HarmonyOS鸿蒙Next中native侧中子线程如何使用JS函数 在NAPI中,JS函数通常只能在JS的主线程里调用。如果在native侧创建了其他子线程,则不能从这些线程调用需要napi_env、napi_value或napi_ref的NAPI接口,所以多线程开发时,native侧子线程必须与主线程进行通信,才能在主线程中调用JavaScript函数。如何简化开发,避免线程间通讯?

3 回复

使用NAPI中的线程安全函数,避免了线程间通信,同时可以回到主线程调用JS函数。 它可以创建一个NAPI对象,该对象包含一个JavaScript函数,并且在多个线程调用。

  • napi_create_threadsafe_function 创建线程安全函数,也是一个NAPI对象,包含一个JS函数,可以从多个线程调用。
  • napi_get_threadsafe_function_context 获取线程安全函数中的context。
  • napi_call_threadsafe_function 调用线程安全函数。
  • napi_acquire_threadsafe_function 指示线程安全函数可以开始使用。
  • napi_release_threadsafe_function 指示线程安全函数将停止使用。

更多关于HarmonyOS鸿蒙Next中native侧中子线程如何使用JS函数的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


在HarmonyOS鸿蒙Next中,native侧的子线程通过NativeEngineNativeValue来调用JS函数。首先,需要在子线程中创建NativeEngine实例,然后通过NativeEngine::GetGlobal获取全局对象,接着使用NativeEngine::GetProperty获取JS函数。最后,通过NativeEngine::CallFunction调用该函数。具体步骤如下:

  1. 创建NativeEngine实例:NativeEngine* engine = new NativeEngine();
  2. 获取全局对象:NativeValue* global = engine->GetGlobal();
  3. 获取JS函数:NativeValue* jsFunction = engine->GetProperty(global, "yourFunctionName");
  4. 调用JS函数:engine->CallFunction(global, jsFunction, args, argc);

其中,args是传递给JS函数的参数数组,argc是参数个数。确保在子线程中正确管理NativeEngine的生命周期,避免内存泄漏。

在HarmonyOS鸿蒙Next中,native侧的子线程无法直接调用JS函数。若需在子线程中执行JS逻辑,可通过以下步骤实现:

  1. 创建JS引擎:在主线程初始化JS引擎。
  2. 传递任务:子线程将待执行的任务数据通过消息队列或事件机制传递给主线程。
  3. 主线程执行JS:主线程接收到任务后,调用JS引擎执行相应的JS函数。
  4. 返回结果:主线程将执行结果返回给子线程。

这种方式确保了JS函数在主线程中安全执行,避免了多线程并发问题。

回到顶部