ArkTS 中的 HashMap 对象传给 C++ 层,如何转换?

如下 ArkTs HashMap 对象传递给到 C++。

import { HashMap } from '@kit.ArkTS'; 
const params = new HashMap<string, Object>(); 
params.set("key1", {}); 
params.set("key2", 2);

​问题1:C++ 层如何判断该对象为 HashMap 对象。

问题2:传到 C++ 层后被识别为 Object 对象,用如下 napi 获取属性名数组获取不到属性名数组,需要如何遍历获取属性值。​

napi_value keyArr; 
auto status = napi_get_property_names(env, value, &keyArr);
HarmonyOS
3天前
浏览
收藏 0
回答 1
待解决
回答 1
按赞同
/
按时间
FengTianYa

Index.ets

build() { 
  Row() { 
    Column() { 
      Text(this.message) 
        .fontSize(50) 
        .fontWeight(FontWeight.Bold) 
        .onClick(() => { 
          hilog.info(0x0000, 'testTag', 'Test NAPI 2 + 3 = %{public}d', testNapi.add(2, 3)); 
          let mapB: HashMap<string, string> = new HashMap(); 
          mapB.set('key_1', 'value_1'); 
          mapB.set('key_2', 'value_2'); 
          mapB.set('key_3', 'value_3'); 
          testNapi.putMap(mapB); 
        }) 
    } 
    .width('100%') 
  } 
  .height('100%') 
}

Native侧:

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; 
} 
 
EXTERN_C_START 
static napi_value Init(napi_env env, napi_value exports) 
{ 
  napi_property_descriptor desc[] = { 
  {"putMap", nullptr, ts_putMap, nullptr, nullptr, nullptr, napi_default, nullptr}, 
{"add", nullptr, Add, nullptr, nullptr, nullptr, napi_default, nullptr} 
}; 
napi_define_properties(env, exports, sizeof(desc) / sizeof(desc[0]), desc); 
return exports; 
} 
EXTERN_C_END
分享
微博
QQ
微信
回复
3天前
相关问题
如何实现ArkTSC/C++对象传
438浏览 • 1回复 待解决
如何实现ArkTSC/C++HashMap转换
943浏览 • 0回复 待解决
ArkTS通过接口访问C++对象
213浏览 • 1回复 待解决
如何C/C++ 创建ArkTS对象
2038浏览 • 1回复 待解决
如何实现ArkTSC/C++数组转换
477浏览 • 1回复 待解决
ArkTS对象绑定C++对象如何回收?
749浏览 • 1回复 待解决
c/c++主动调用ArkTS存在问题
230浏览 • 1回复 待解决
ts给c++传递数组,c++如何解析
1695浏览 • 1回复 待解决
HarmonyOS ArkTSC/C++交互
431浏览 • 1回复 待解决
ArkTS调用C++成员函数
1141浏览 • 1回复 待解决
HarmonyOS C++自定义组件如何开发?
192浏览 • 1回复 待解决
ArkTSC++之间交互
1140浏览 • 1回复 待解决
C++调用ArkTS 定义方法
1662浏览 • 1回复 待解决
C++ 如何获取操作 Arkts 实例
760浏览 • 1回复 待解决
通过Native 调用c++实现文本绘制
854浏览 • 1回复 待解决