HarmonyOS鸿蒙Next中napi暴露给ArkTs层的接口仅有一个napi_value返回值,而我有多个返回值,也有指针信息,都想返回给ArkTs层,怎么实现

HarmonyOS鸿蒙Next中nnapi暴露给ArkTS层的接口仅可返回一个napi_value,而我现在有多个返回值(String、number等),也一些有c++指针信息,这些信息我都想返回给ArkTS层,怎么实现?

3 回复

napi_value虽然只有一个返回值,但你可以直接在返回值上封装上你想要的所有信息。

比如你通过napi_create_object,创建出一个obj,用这个obj来承载返回的所有信息,number和string都可以通过napi_set_property/napi_set_named_property等属性设置的接口设置到obj上。指针信息也可以通过napi_wrap接口绑定c++和js对象信息,后续在通过napi_unwrap取出来。

使用Node-API接口进行object相关开发-Node-API使用指导-使用Node-API实现跨语言交互-代码开发-NDK开发 - 华为HarmonyOS开发者

当然用js Array也可以,很灵活,有承载体即可。

使用Node-API接口进行array相关开发-Node-API使用指导-使用Node-API实现跨语言交互-代码开发-NDK开发 - 华为HarmonyOS开发者

更多关于HarmonyOS鸿蒙Next中napi暴露给ArkTs层的接口仅有一个napi_value返回值,而我有多个返回值,也有指针信息,都想返回给ArkTs层,怎么实现的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


在HarmonyOS鸿蒙Next中,若需将多个返回值和指针信息暴露给ArkTs层,可以使用napi_create_object创建一个对象,将多个值作为该对象的属性。通过napi_set_named_property将每个返回值设置为对象的属性,最后返回该对象。指针信息可通过napi_create_external封装为外部对象,并同样设置为属性返回。

在HarmonyOS Next的NAPI开发中,确实只能返回单个napi_value,但可以通过以下方式实现多返回值:

  1. 使用对象封装: 将多个返回值封装到一个对象中返回,这是最常用的方式:
napi_value CreateResult(napi_env env, const string& str, int num) {
    napi_value result;
    napi_create_object(env, &result);
    
    napi_value strValue, numValue;
    napi_create_string_utf8(env, str.c_str(), str.length(), &strValue);
    napi_create_int32(env, num, &numValue);
    
    napi_set_named_property(env, result, "strData", strValue);
    napi_set_named_property(env, result, "numData", numValue);
    
    return result;
}
  1. 对于C++指针: 需要先转换为整型再返回,ArkTS层使用时需谨慎处理内存管理:
napi_value GetPointer(napi_env env, void* ptr) {
    napi_value result;
    napi_create_int64(env, reinterpret_cast<int64_t>(ptr), &result);
    return result;
}
  1. 数组方式:
napi_value CreateArrayResult(napi_env env, const string& str, int num) {
    napi_value result;
    napi_create_array(env, &result);
    
    napi_value strValue, numValue;
    napi_create_string_utf8(env, str.c_str(), str.length(), &strValue);
    napi_create_int32(env, num, &numValue);
    
    napi_set_element(env, result, 0, strValue);
    napi_set_element(env, result, 1, numValue);
    
    return result;
}

ArkTS层调用示例:

let result = nativeModule.getMultiData();
console.log(result.strData);  // 字符串
console.log(result.numData);  // 数字
回到顶部