HarmonyOS native层C++子线程中回调函数中调用ArkTS层中定义的类的public成员函数

开发的语音SDK中,在C代码中会新建子线程,并在获取到网络数据后以回调的形式回调到native层的c函数中。现在想在这个c函数中继续回调ArkTS层定义的类实例中的成员函数,但由于c调用ArkTS函数所需的函数napi_call_function()需要env参数和recv参数,看介绍env不建议自己进行缓存、并且在C++的子线程中调用好像有问题,目前暂时无法实现我想要的功能。 请问需要参考哪个文档过来实现呢?

HarmonyOS
2024-12-19 16:38:05
浏览
收藏 0
回答 1
待解决
回答 1
按赞同
/
按时间
Heiang

napi_load_module接口可以提供在主线程中进行模块加载的功能,当模块加载出来之后,可以使用函数napi_get_property获取模块导出的变量,也可以使用napi_get_named_property获取模块导出的函数。

参考文档如下:https://developer.huawei.com/consumer/cn/doc/harmonyos-guides-V5/use-napi-load-module-V5

内部文档中有查询到napi_load_module_with_info支持在子线程中加载模块,内容如下:通过pthread_create创建新线程后,可以通过napi_create_ark_runtime来创建一个新的ArkTs基础运行时环境,并通过该运行时环境加载ArkTs模块,目支持在ArkTs模块中使用console接口打印日志,使用timer定时器功能。当使用结束后,需要通过napi_destroy_ark_runtime来销毁所创建的ArkTs基础运行时环境。

// ObjectUtils.ets
export function Logger() {
  console.log("print log");
}
#include <pthread.h>

#include "napi/native_api.h"

static void *CreateArkRuntimeFunc(void *arg)
{
  // 1. 创建基础运行环境
  napi_env env;
  napi_status ret = napi_create_ark_runtime(&env);
  if (ret != napi_ok) {
    return nullptr;
  }
  
  // 2. 加载自定义模块
  napi_value objUtils;
  ret = napi_load_module_with_info(env, "ets/pages/ObjectUtils", "com.exmaple.myapplication/entry", &objUtils);
  if (ret != napi_ok) {
    return nullptr;
  }
  
  // 3. 使用ArtTs中的logger
  napi_value logger;
  ret = napi_get_named_property(env, objUtils, "Logger", &logger);
  if (ret != napi_ok) {
    return nullptr;
  }
  ret = napi_call_function(env, objUtils, logger, 0, nullptr, nullptr);
  
  // 4. 销毁ArkTS环境
  ret = napi_destroy_ark_runtime(&env);
  
  return nullptr;
}

static napi_value CreateArkRuntime(napi_env env, napi_callback_info info)
{
  pthread_t tid;
  pthread_create(&tid, nullptr, CreateArkRuntimeFunc, nullptr);
  pthread_join(tid, nullptr);
  return nullptr;
}
分享
微博
QQ
微信
回复
2024-12-19 18:51:05
相关问题
ArkTS调用C++成员函数
1863浏览 • 1回复 待解决
HarmonyOS C++ 调用 ets 函数报错闪退
534浏览 • 1回复 待解决
HarmonyOS C++如何同步调用JS函数 -
407浏览 • 0回复 待解决
Native调用ArkTS函数
1478浏览 • 1回复 待解决
如何为 C++ 提供函数
3030浏览 • 1回复 待解决
c/c++主动调用ArkTS存在问题
1139浏览 • 1回复 待解决
通过Native 调用c++实现文本绘制
1530浏览 • 1回复 待解决