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;
}
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
  • 26.
  • 27.
  • 28.
  • 29.
  • 30.
  • 31.
  • 32.
  • 33.
  • 34.
  • 35.
  • 36.
  • 37.
  • 38.
  • 39.
  • 40.
  • 41.
  • 42.
  • 43.
  • 44.
  • 45.
  • 46.
  • 47.
  • 48.
  • 49.
  • 50.
  • 51.
  • 52.
  • 53.
  • 54.
  • 55.
  • 56.
  • 57.
  • 58.
  • 59.
  • 60.
  • 61.
  • 62.
  • 63.
  • 64.
  • 65.
  • 66.
  • 67.
  • 68.
分享
微博
QQ
微信
回复
2024-12-19 19:08:29
相关问题
HarmonyOS native C++ 传递buffer 到ArkTS
1139浏览 • 1回复 待解决
ArkTS通过接口访问C++对象
1232浏览 • 1回复 待解决
tsc++传递数组,c++如何解析
2767浏览 • 1回复 待解决
通过Native 调用c++实现文本绘制
1958浏览 • 1回复 待解决
c/c++主动调用ArkTS存在问题
1659浏览 • 1回复 待解决
HarmonyOSC++触发通知到ArkTS
985浏览 • 1回复 待解决
HarmonyOS C++自定义组件如何开发
1178浏览 • 1回复 待解决
HarmonyOS C++如何同步调用JS函数 -
818浏览 • 0回复 待解决
如何实现ArkTSC/C++对象传递
1718浏览 • 1回复 待解决
ArkTs怎么传递对象或者类Native
3512浏览 • 1回复 待解决