HarmonyOS 鸿蒙Next C++主动调用js端的解决方案

发布于 1周前 作者 sinazl 来自 鸿蒙OS

HarmonyOS 鸿蒙Next C++主动调用js端的解决方案 现在文档的示例都是,js调用c之后再从c里面调用js。现需要在C端(可能在单独的一个线程中)可以主动的调用js。有没有C主动调用js端的解决方案?

3 回复

可参考:

// 子线程运行函数
static void CallJs(napi_env env, napi_value js_cb, void* context, void* data)
{
  // 获取引用值
  napi_get_reference_value(env, cbObj, &js_cb);
  // 创建一个ArkTS number作为ArkTS function的入参。

  napi_value argv;
  napi_create_int32(env, cValue, &argv);
  napi_value result = nullptr;

  napi_call_function(env, nullptr, js_cb, 1, &argv, &result);
  napi_get_value_int32(env, result, &cValue);

}
// Native 主线程

static napi_value ThreadsTest(napi_env env, napi_callback_info info)
{
  // 从ArkTS侧获取的参数的数量
  size_t argc = 1;
  napi_value js_cb, work_name;
  // 获取ArkTS参数

  napi_get_cb_info(env, info, &argc, &js_cb, nullptr, nullptr);
  // 指向napi_value js_cb 的 napi_ref cbObj

  napi_create_reference(env, js_cb, 1, &cbObj);
  // 通过UTF8编码的C字符串数据创建work_name

  napi_create_string_utf8(env, "Work Item", NAPI_AUTO_LENGTH, &work_name);
  // 创建线程安全函数

  napi_create_threadsafe_function(env, js_cb, NULL, work_name, 0, 1, NULL, NULL, NULL, CallJs, &tsfn);
  // 其他线程中调用线程安全函数

  std::thread t({
  // 可获取线程ID
  std::thread::id this_id = std::this_thread::get_id();
  napi_acquire_threadsafe_function(tsfn);
  napi_call_threadsafe_function(tsfn, NULL, napi_tsfn_blocking);
});
  t.detach();
  return nullptr;

}

更多关于HarmonyOS 鸿蒙Next C++主动调用js端的解决方案的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


在HarmonyOS鸿蒙Next中,C++主动调用JS端的解决方案可以通过使用Native API和JS API的交互机制来实现。具体步骤如下:

  1. 创建C++ Native Module:首先,需要创建一个C++ Native Module,这个Module将负责与JS端进行交互。在C++代码中,定义一个类,并继承Ability类或Extension类,实现所需的功能。

  2. 注册Native Module:在config.json文件中注册这个Native Module,以便在JS端能够调用。

  3. 定义JS API:在JS端定义一个API,这个API将被C++代码调用。可以使用@ohos.ability.featureAbility模块中的callFunction方法来实现。

  4. C++调用JS API:在C++代码中,使用CallFunction方法调用JS端定义的API。CallFunction方法允许C++代码传递参数给JS端,并接收JS端的返回值。

  5. 处理回调:在JS端处理C++传递过来的参数,并返回处理结果。C++代码可以通过回调函数或Promise机制接收JS端的返回结果。

  6. 编译和运行:将C++代码和JS代码一起编译,运行在鸿蒙设备上,验证C++调用JS端的功能是否正常。

通过以上步骤,可以在HarmonyOS鸿蒙Next中实现C++主动调用JS端的功能,确保C++和JS之间的交互顺利进行。

在鸿蒙Next中,C++主动调用JS端可以通过NAPI(Native API)实现。首先,使用napi_create_function创建C++函数,然后通过napi_call_function调用JS函数。确保在JS端定义了对应的函数,并通过napi_get_global获取全局对象。最后,使用napi_get_property获取JS函数并调用。示例代码如下:

napi_value jsFunction;
napi_get_named_property(env, global, "jsFunctionName", &jsFunction);
napi_call_function(env, global, jsFunction, 0, nullptr, nullptr);

确保在CMakeLists.txt中正确配置NAPI模块。

回到顶部
AI 助手
你好,我是IT营的 AI 助手
您可以尝试点击下方的快捷入口开启体验!