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

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

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

使用的核心API

napi_get_named_property
napi_call_function

核心代码解释

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

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 listA: List<string> = new List<string>();   
          listA.add('assssssss');   
          listA.add('aabbbcccc');   
          listA.add('1dddddddd45');   
          listA.add('eeeeeee');   
          listA.add('5ddddddddddd');   
          testNapi.putList(listA);   
        })   
    }   
    .width('100%')   
  }   
  .height('100%')   
}

C++层获取List数据:

// 将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;   
}   
   
// list.get(index) 根据index 取对应list中的值   
static std::string getByIndex(napi_env env, napi_value list, int index) {   
    napi_value indexValue, getFun, value;   
    size_t getStringLength = 0;   
    napi_create_int32(env, index, &indexValue);   
    napi_get_named_property(env, list, "get", &getFun);   
    napi_call_function(env, list, getFun, 1, &indexValue, &value);   
    return value2String(env, value);   
}   
   
static napi_value ts_putList(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 list = args[0]; // 获取list对象   
   
    napi_value length = NULL;   
    napi_get_named_property(env, list, "length", &length);   
   
    int32_t lengthSize = 0;   
    napi_get_value_int32(env, length, &lengthSize); // 获取list长度   
    OH_LOG_Print(LOG_APP, LOG_INFO, LOG_DOMAIN, LOG_TAG, "ts_putList list.length = %{public}d", lengthSize);   
   
    napi_value indexValue, getFun, getValue;   
    size_t getStringLength = 0;   
    for (int index = 0; index < lengthSize; index++) {   
        std::string stringValue = getByIndex(env, list, index);   
        OH_LOG_Print(LOG_APP, LOG_INFO, LOG_DOMAIN, LOG_TAG, "ts_putList list::get = %{public}s", stringValue.c_str());   
    }   
    return nullptr;   
}   
   
EXTERN_C_START   
static napi_value Init(napi_env env, napi_value exports)   
{   
    napi_property_descriptor desc[] = {   
        {"putList", nullptr, ts_putList, 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:30:42
相关问题
xargs命令中多个参数实例?
7779浏览 • 1回复 待解决
ArrayBuffer是否一定要固定长度参数
632浏览 • 1回复 待解决
router传递hashmap参数问题
349浏览 • 1回复 待解决
OpenHarmony startAbility 如何获取参数
6107浏览 • 0回复 待解决
如何查看OceanBase 集群参数
2133浏览 • 1回复 待解决
DirectionalLayout没有spacing参数吗?
4978浏览 • 1回复 待解决
参数不识别(ohpm run)
229浏览 • 1回复 待解决
如何修改OceanBase 集群参数
2812浏览 • 1回复 待解决
如何使用Navigation的navPathStack参数
193浏览 • 1回复 待解决
PolarDB MySQL 的参数有哪些?
1647浏览 • 1回复 待解决
mybatis 多个参数时,如何用in?
904浏览 • 1回复 待解决
HTTP GET请求时如何传递参数
1759浏览 • 1回复 待解决
路由传入参数有大小限制吗
502浏览 • 1回复 待解决
measureTextSize的测量参数不清晰
368浏览 • 1回复 待解决
获取运行时编译构建参数
472浏览 • 1回复 待解决