从ArkTs向Native传复杂参数--- HashMap参数篇

​现实场景中,存在这样一种场景,在ArkTS层定义的List变量,从ArkTs向Native C++层传递HashMap数据时,如何在nativeC++层获取到呢。

HarmonyOS
2024-05-23 21:34:03
浏览
已于2024-5-24 16:35:24修改
收藏 0
回答 1
待解决
回答 1
按赞同
/
按时间
NingJ

使用的核心API

napi_get_named_property
napi_call_function

核心代码解释

Index.ets文件向C++层传递HashMap数据:

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%')   
}

C++层获取HashMap数据:

// 将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;   
}   
   
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

实现效果

手机上执行结果如下:

适配的版本信息

IDE:DevEco Studio 4.1.1.300     DevEco Studio 4.1 Canary1

SDK:HarmoneyOS 4.0.10.15

分享
微博
QQ
微信
回复
2024-05-24 16:29:06
相关问题
ArkTsNative复杂参数---List参数
325浏览 • 1回复 待解决
router传递hashmap参数问题
352浏览 • 1回复 待解决
arktshashmap转为native
403浏览 • 1回复 待解决
xargs命令中多个参数实例?
7783浏览 • 1回复 待解决
ArrayBuffer是否一定要固定长度参数
633浏览 • 1回复 待解决
OpenHarmony startAbility 如何获取参数
6109浏览 • 0回复 待解决
如何查看OceanBase 集群参数
2137浏览 • 1回复 待解决
DirectionalLayout没有spacing参数吗?
4980浏览 • 1回复 待解决
如何修改OceanBase 集群参数
2813浏览 • 1回复 待解决
参数不识别(ohpm run)
248浏览 • 1回复 待解决
PolarDB MySQL 的参数有哪些?
1647浏览 • 1回复 待解决
如何使用Navigation的navPathStack参数
203浏览 • 1回复 待解决
mybatis 多个参数时,如何用in?
908浏览 • 1回复 待解决
如何实现ArkTS与C/C++的HashMap转换?
361浏览 • 0回复 待解决
路由传入参数有大小限制吗
502浏览 • 1回复 待解决
HTTP GET请求时如何传递参数
1762浏览 • 1回复 待解决
measureTextSize的测量参数不清晰
370浏览 • 1回复 待解决