在OpenHarmony开发板上验证hap包中集成的C/C++三方库

2024-04-13 23:04

本文主要是介绍在OpenHarmony开发板上验证hap包中集成的C/C++三方库,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

简介

理论上C/C++三方库的测试验证一般使用原生库自带的测试用例进行验证,但OpenHarmony的北向应用调用C/C++三方库是需要通过napi接口实现的,因此对于hap包中集成的C/C++三方库的验证也需要通过开发对应的napi接口来进行验证。

本文通过minizip为例介绍hap包中集成C/C++三方库的验证过程。

napi接口定义

C/C++三方库napi接口定义一般分2种情况

  • 有需求,需求方给出对应的napi接口定义。
  • 无需求,根据三方库功能自定义napi接口。

对于自定义的napi接口,需要覆盖主要功能,且需要返回测试的正确结果。对于较为复杂的三方库,我们也可以将原生库的测试用例封装成napi接口,通过应用的调用实现原生库的测试验证。

minizip三方库是无用户需求的,因此我们需要自己定义napi接口进行验证。首先确认该库的功能是对文件进行压缩和解压缩,其次对minizip原生库的测试用例进行分析发现,通过输入不同的参数实现不同能力的压缩和解压缩功能。因此我们可以设计出2个napi接口,一个实现压缩功能,另一个实现解压缩功能。而对于其他能力(如加解密,多文件等)通过传入参数进行实现。具体的接口如下:

export class minizipNapi {compress(data:miniProperty):number;         // 实现压缩功能decompress(data:miniProperty):number;       // 实现解压缩功能
}

其中miniProperty为实现压缩解压缩时的参数,具体内容如下:

export interface miniOptions {include_path?:number                // 是否包含路径compress_level?:number              // 压缩等级compress_method?:number             // 压缩方式overwrite?:number                   // 是否覆盖append?:number                      // 是否追加disk_size?:number                   // 文件大小follow_links?:number                // 遵循符号链接store_links?:number                 // 存储符号链接zip_cd?:number                      // 是否是zip压缩encoding?:number                    // 编码方式verbose?:number                     // 版本号aes?:number                         // 是否需要aes校验cert_path?:string                   // 校验文件路径cert_pwd?:string                    // 校验密码
}export interface miniProperty {path:string                         // 解/压缩 路径password?:string                    // 解/压缩 密码operate?:string                     // 压缩/解压缩file_extract?:string                // 解压后文件夹名字option:miniOptions                  // 属性directory?:string                   // 解压缩文件目标路径files?:Array<string>                // 压缩文件
}

通过以上的2个接口及对应的参数,我们就可以实现类似原生库的测试验证

接口测试

我们可以在应用中定义多个按钮,通过点击按钮实现对文件的压缩和解压缩功能。

  • 实现正常的文件压缩和解压缩

    Button(this.button0Txt).fontSize(50).margin({top:30}).fontWeight(FontWeight.Normal).onClick(() => {if (this.button0 == 0) {      // 压缩功能this.button0 = 1;this.button0Txt = "decompress"if (this.mzip != undefined) {console.info("[Minizip]start compress!");try {let result = this.mzip.compress({ path: this.dir + "result.zip", operate: "compress", option: { append: 1, compress_level: 9 }, files: [this.dir + "file1.txt"] })if (result == undefined) {  // 压缩失败this.button0 = 0;this.button0Txt = "compress"}console.info("[Minizip]compress result = " + JSON.stringify(result));}catch(e) {console.info("[Minizip] error : " + JSON.stringify(e));}}else {console.info("[Minizip] mzip is undefined!");}} else {              // 解压功能this.button0 = 0;this.button0Txt = "compress"if (this.mzip != undefined) {console.info("[Minizip]start decompress!");let result = this.mzip.decompress({path:this.dir + "result.zip", operate:"decompress", option:{overwrite:1, compress_level:9}, directory:this.dir + "out"})if (result == undefined) {  // 压缩失败this.button0 = 0;this.button0Txt = "decompress"}console.info("[Minizip]compress result = " + JSON.stringify(result));} else {console.info("[Minizip] mzip is undefined!");}}})
    

    在这我们可以看到,普通的压缩功能我们只需要设置被压缩的文件(files1.txt)以及生成的目标文件(result.zip),压缩方式以及压缩等级。其中被压缩文件和生成的目标文件都必须带有绝对路径,该路径的获取方式’this.dir = globalThis.abilityContext.filesDir + “/”‘,对应开发板上的具体路径为’/data/app/el2/100/base/com.example.minizip/haps/entry/files’.

  • 实现带密码的压缩和解压缩

    如果需要实现带密码的压缩的话,我们在普通的压缩基础上加上密码属性即可。

    // 实现带密码的压缩,密码为test
    let result = this.mzip.compressWithPsd({path:this.dir + "result1.zip", password:"test", operate:"compress", option:{overwrite:1,compress_level:9}, files:[this.dir + "file1.txt"]})// 实现带密码的解压缩,密码为 test
    let result = this.mzip.decompressWithPsd({path:this.dir + "result1.zip", password:"test", operate:"decompress", option:{overwrite:1, compress_level:9}, directory:this.dir + "out"})
    

    以此类推,我们可以根据各个参数的意义进行不同能力的压缩和解压缩功能测试验证。

测试结果验证

测试验证的结果我们可以根据返回值显示到屏幕上,这样比较直观,如:

this.button0Txt = "compress"
if (result == undefined) {  // 压缩失败this.button0 = 0;this.button0Txt = "compress"
}

压缩成功,我们按钮上显示为’decompress’(即压缩成功后,下一次按下按钮执行解压缩功能),而如果失败则还是显示为’compress’。当然除了程序中通过返回结果进行判断测试结果,我们还需要将实际的压缩文件拷贝出来验证压缩的正确性。解压后的文件可以直接通过cmp命令将其与被压缩的文件进行比较来验证功能的正确性。

为了能让大家更好的学习鸿蒙(HarmonyOS NEXT)开发技术,这边特意整理了《鸿蒙开发学习手册》(共计890页),希望对大家有所帮助:https://qr21.cn/FV7h05

《鸿蒙开发学习手册》:

如何快速入门:https://qr21.cn/FV7h05

  1. 基本概念
  2. 构建第一个ArkTS应用
  3. ……

开发基础知识:https://qr21.cn/FV7h05

  1. 应用基础知识
  2. 配置文件
  3. 应用数据管理
  4. 应用安全管理
  5. 应用隐私保护
  6. 三方应用调用管控机制
  7. 资源分类与访问
  8. 学习ArkTS语言
  9. ……

基于ArkTS 开发:https://qr21.cn/FV7h05

  1. Ability开发
  2. UI开发
  3. 公共事件与通知
  4. 窗口管理
  5. 媒体
  6. 安全
  7. 网络与链接
  8. 电话服务
  9. 数据管理
  10. 后台任务(Background Task)管理
  11. 设备管理
  12. 设备使用信息统计
  13. DFX
  14. 国际化开发
  15. 折叠屏系列
  16. ……

鸿蒙开发面试真题(含参考答案):https://qr18.cn/F781PH

鸿蒙开发面试大盘集篇(共计319页):https://qr18.cn/F781PH

1.项目开发必备面试题
2.性能优化方向
3.架构方向
4.鸿蒙开发系统底层方向
5.鸿蒙音视频开发方向
6.鸿蒙车载开发方向
7.鸿蒙南向开发方向

这篇关于在OpenHarmony开发板上验证hap包中集成的C/C++三方库的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/901468

相关文章

C++如何通过Qt反射机制实现数据类序列化

《C++如何通过Qt反射机制实现数据类序列化》在C++工程中经常需要使用数据类,并对数据类进行存储、打印、调试等操作,所以本文就来聊聊C++如何通过Qt反射机制实现数据类序列化吧... 目录设计预期设计思路代码实现使用方法在 C++ 工程中经常需要使用数据类,并对数据类进行存储、打印、调试等操作。由于数据类

Spring Boot 集成 Quartz并使用Cron 表达式实现定时任务

《SpringBoot集成Quartz并使用Cron表达式实现定时任务》本篇文章介绍了如何在SpringBoot中集成Quartz进行定时任务调度,并通过Cron表达式控制任务... 目录前言1. 添加 Quartz 依赖2. 创建 Quartz 任务3. 配置 Quartz 任务调度4. 启动 Sprin

Linux下如何使用C++获取硬件信息

《Linux下如何使用C++获取硬件信息》这篇文章主要为大家详细介绍了如何使用C++实现获取CPU,主板,磁盘,BIOS信息等硬件信息,文中的示例代码讲解详细,感兴趣的小伙伴可以了解下... 目录方法获取CPU信息:读取"/proc/cpuinfo"文件获取磁盘信息:读取"/proc/diskstats"文

Linux内核参数配置与验证详细指南

《Linux内核参数配置与验证详细指南》在Linux系统运维和性能优化中,内核参数(sysctl)的配置至关重要,本文主要来聊聊如何配置与验证这些Linux内核参数,希望对大家有一定的帮助... 目录1. 引言2. 内核参数的作用3. 如何设置内核参数3.1 临时设置(重启失效)3.2 永久设置(重启仍生效

C++使用printf语句实现进制转换的示例代码

《C++使用printf语句实现进制转换的示例代码》在C语言中,printf函数可以直接实现部分进制转换功能,通过格式说明符(formatspecifier)快速输出不同进制的数值,下面给大家分享C+... 目录一、printf 原生支持的进制转换1. 十进制、八进制、十六进制转换2. 显示进制前缀3. 指

SpringBoot集成Milvus实现数据增删改查功能

《SpringBoot集成Milvus实现数据增删改查功能》milvus支持的语言比较多,支持python,Java,Go,node等开发语言,本文主要介绍如何使用Java语言,采用springboo... 目录1、Milvus基本概念2、添加maven依赖3、配置yml文件4、创建MilvusClient

C++中初始化二维数组的几种常见方法

《C++中初始化二维数组的几种常见方法》本文详细介绍了在C++中初始化二维数组的不同方式,包括静态初始化、循环、全部为零、部分初始化、std::array和std::vector,以及std::vec... 目录1. 静态初始化2. 使用循环初始化3. 全部初始化为零4. 部分初始化5. 使用 std::a

C++ vector的常见用法超详细讲解

《C++vector的常见用法超详细讲解》:本文主要介绍C++vector的常见用法,包括C++中vector容器的定义、初始化方法、访问元素、常用函数及其时间复杂度,通过代码介绍的非常详细,... 目录1、vector的定义2、vector常用初始化方法1、使编程用花括号直接赋值2、使用圆括号赋值3、ve

如何高效移除C++关联容器中的元素

《如何高效移除C++关联容器中的元素》关联容器和顺序容器有着很大不同,关联容器中的元素是按照关键字来保存和访问的,而顺序容器中的元素是按它们在容器中的位置来顺序保存和访问的,本文介绍了如何高效移除C+... 目录一、简介二、移除给定位置的元素三、移除与特定键值等价的元素四、移除满足特android定条件的元

Python获取C++中返回的char*字段的两种思路

《Python获取C++中返回的char*字段的两种思路》有时候需要获取C++函数中返回来的不定长的char*字符串,本文小编为大家找到了两种解决问题的思路,感兴趣的小伙伴可以跟随小编一起学习一下... 有时候需要获取C++函数中返回来的不定长的char*字符串,目前我找到两种解决问题的思路,具体实现如下: