HarmonyOS native开发中如何传递map给c++层 / node-api层如何反射调用ArkTS对象

HarmonyOS
2024-12-19 15:56:52
浏览
收藏 0
回答 1
待解决
回答 1
按赞同
/
按时间
zbw_apple

1、可以参考下面的demo。

2、可以使用napi_load_module来调用ArkTS层的方法。

#include <string>
#include "napi/native_api.h"
#define LOG_TAG "testTag"
#include "hilog/log.h"
// 将value转成字符串返回
static std::string value2String(napi_env env, napi_value value) {
  size_t stringSize = 0;
  napi_get_value_string_utf8(env, value, nullptr, 0, &stringSize); // 获取字符串长度
  std::string valueString;
  valueString.resize(stringSize + 1);
  napi_get_value_string_utf8(env, value, &valueString[0], stringSize + 1, &stringSize); // 根据长度传换成字符串
  return valueString;
}

// nextResult.done 返回是否迭代下一个节点
static bool nextDone(napi_env env, napi_value nextResult) {
  napi_value done = NULL;
  napi_get_named_property(env, nextResult, "done", &done);
  bool isDone = false;
  napi_get_value_bool(env, done, &isDone);
  return isDone;
}

// nextResult<string>.value 获取当前迭代节点的值
static std::string nextValue(napi_env env, napi_value nextResult) {
  napi_value value = NULL;
  napi_get_named_property(env, nextResult, "value", &value);
  return value2String(env, value);
}
// map.get(key) 根据key从map中取value
static std::string getValueByKey(napi_env env, napi_value map, std::string key) {
  napi_value mapKey, mapValue, getFun;
  napi_create_string_utf8(env, key.c_str(), NAPI_AUTO_LENGTH, &mapKey);
  napi_get_named_property(env, map, "get", &getFun);
  napi_call_function(env, map, getFun, 1, &mapKey, &mapValue);
  return value2String(env, mapValue);
}

static napi_value ts_putMap(napi_env env, napi_callback_info info) {
  size_t argc = 1;
  napi_value args[1] = {nullptr};
  napi_get_cb_info(env, info, &argc, args, nullptr, nullptr);

  napi_value map = args[0];

  napi_value size = NULL;
  napi_get_named_property(env, map, "length", &size);

  int32_t sizeSize = 0;
  napi_get_value_int32(env, size, &sizeSize);
  OH_LOG_Print(LOG_APP, LOG_INFO, LOG_DOMAIN, LOG_TAG, "ts_putMap map.length = %{public}d", sizeSize);

  napi_value keysFun, iterableIterator = NULL;
  napi_get_named_property(env, map, "keys", &keysFun);
  napi_call_function(env, map, keysFun, 0, NULL, &iterableIterator); // 拿到map的迭代器

  napi_value nextFun, nextResult;
  napi_get_named_property(env, iterableIterator, "next", &nextFun);
  napi_call_function(env, iterableIterator, nextFun, 0, NULL, &nextResult);
  while (!nextDone(env, nextResult)) {
    std::string mapKeyString = nextValue(env, nextResult);
    std::string mapValueString = getValueByKey(env, map, mapKeyString);
    OH_LOG_Print(LOG_APP, LOG_INFO, LOG_DOMAIN, LOG_TAG, "ts_putMap while::nextVal = %{public}s - %{public}s",
      mapKeyString.c_str(), mapValueString.c_str());
    napi_call_function(env, iterableIterator, nextFun, 0, NULL, &nextResult);
  }
  return nullptr;
}
分享
微博
QQ
微信
回复
2024-12-19 19:08:29
相关问题
tsc++传递数组,c++如何解析
2257浏览 • 1回复 待解决
ArkTS通过接口访问C++对象
806浏览 • 1回复 待解决
c/c++主动调用ArkTS存在问题
1113浏览 • 1回复 待解决
通过Native 调用c++实现文本绘制
1506浏览 • 1回复 待解决
HarmonyOSC++触发通知到ArkTS
492浏览 • 1回复 待解决
HarmonyOS C++如何同步调用JS函数 -
397浏览 • 0回复 待解决
HarmonyOS C++自定义组件如何开发
762浏览 • 1回复 待解决
如何实现ArkTSC/C++对象传递
1198浏览 • 1回复 待解决
ArkTs怎么传递对象或者类Native
3060浏览 • 1回复 待解决
HarmonyOS C++ 调用 ets 函数报错闪退
516浏览 • 1回复 待解决