[示例代码]跨语言复杂参数交互

ComplexTypePass: 本示例介绍如何通过Native-API,在ArkTS与Native之间传递数据。

介绍

本示例介绍了复杂数据类型在ArkTS与C++两种环境间传递、调用的方法。包含array、object、hashMap、pixelMap、class五种类型。

效果图预览

应用首页Uint8ArrayObject

HashMapPixelMapClass

使用说明

  1. 进入应用后,下方按钮,分别对应五种数据类型的示例。
  2. Uint8Array,uint8Array类型示例。在上部输入框内可以输入0-255的数字。点击“执行”后,程序会将数组从ArkTS传递至C++再返回,之后显示在下方输出框中。
  3. Object,object类型示例。在上部输入框内可以输入合理年龄和姓名。点击“执行”后,程序会将包含输入信息的object从ArkTS传递至C++,C++会判断其为成人与否,并分组排序,再返回包含输出信息的object,之后显示在下方输出框中。
  4. HashMap,hashMap类型示例。在上部输入框内可以输入0-9的数字。点击“执行”后,程序会将包含输入信息的hashMap从ArkTS传递至C++,C++会累加每个对象每次的输入值,再返回包含输出信息的hashMap,之后显示在下方输出框中。
  5. PixelMap,pixelMap类型示例。点击“执行”后,程序会将图片的pixelMap从ArkTS传递至C++,C++将其处理为黑白图片,再返回ArkTS,之后刷新图片。
  6. Class,class类型示例。点击“ArsTS class pass to Napi”后,程序会将ArkTS的Class传递至C++,C++调用其方法后,将结果显示至输出框中。点击“Napi class pass to ArkTS”后,程序会将C++的Class传递至ArkTS,ArkTS调用其方法后,将结果显示至输出框中。

实现思路

  1. 通过napi_define_properties和napi_define_class绑定ArkTS和C++两端的函数和class。
  2. uint8ArrayPassing函数实现uint8Array数据的传递。通过构造buffer完成数组传递,使用napi_get_arraybuffer_info将数组从ArkTS传递至C++,而后使用napi_create_arraybuffer将数组传回。
  3. objectPassing函数实现object数据的传递。通过napi_get_cb_info将数据从ArkTS传递至C++,而后使用napi_create_object_with_named_properties构造object并传回。
  4. hashMapPassing函数实现hashMap数据的传递。先将hashMap序列化,以字符串的形式传递至C++,在C++反序列化,编辑后再序列化,以字符串形式传回ArkTS并完成反序列化。ArkTS中使用JSON完成序列化与反序列化,C++中使用nlohmann库。
  5. pixelMapPassing函数实现pixelMap数据的传递。将pixelMap以uint8Array的格式传递,实现方法几乎相同。
  6. classPassingTs2Napi函数实现class数据从ArkTS至C++传递。通过napi_get_named_property获取属性,napi_call_function调用函数。
  7. new sampleClassNapi2Ts()实现class数据从C++至ArkTS传递。getHintStr与setHintStr分别负责属性的查询与设置,napi_define_class绑定class,napi_set_named_property绑定参数。
  8. 主要实现内容参考napi_init.cpp

工程结构&模块类型

 ├───entry/src/main/ets                             
 │   ├───entryability
 │   │   └───EntryAbility.ets                        // Ability的生命周期回调内容
 │   ├───entrybackupability
 │   │   └───EntryBackupAbility.ets                  // BackupAbility的生命周期回调内容
 │   ├───model
 │   │   ├───IDModel.ets                             // 广告组件参数
 │   │   └───SampleObject.ets                        // object类型声明
 │   └───pages
 │       ├───ClassPage.ets                           // class传递页面
 │       ├───HashMapPage.ets                         // hashMap传递页面
 │       ├───Index.ets                               // 应用入口
 │       ├───ObjectPage.ets                          // object传递页面
 │       ├───PixelMapPage.ets                        // pixelMap传递页面
 │       └───Uint8ArrayPage.ets                      // uint8Array传递页面
 ├───entry/src/main/cpp  
 │   ├───thirdparty                                  // 三方库文件
 │   ├───types/libentry/Index.d.ts                   // 函数、类型声明
 │   └───napi_init.cpp                               // c++工程
 └───entry/src/main/resources                        // 应用静态资源目录

模块依赖

不涉及

约束与限制

1.本示例仅支持标准系统上运行,支持设备:华为手机。

2.HarmonyOS系统:HarmonyOS NEXT Beta1及以上。

3.DevEco Studio版本:DevEco Studio NEXT Beta1及以上。

4.HarmonyOS SDK版本:HarmonyOS NEXT Beta1 SDK及以上。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值