在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++使用栈实现括号匹配的代码详解

《C++使用栈实现括号匹配的代码详解》在编程中,括号匹配是一个常见问题,尤其是在处理数学表达式、编译器解析等任务时,栈是一种非常适合处理此类问题的数据结构,能够精确地管理括号的匹配问题,本文将通过C+... 目录引言问题描述代码讲解代码解析栈的状态表示测试总结引言在编程中,括号匹配是一个常见问题,尤其是在

使用C++实现链表元素的反转

《使用C++实现链表元素的反转》反转链表是链表操作中一个经典的问题,也是面试中常见的考题,本文将从思路到实现一步步地讲解如何实现链表的反转,帮助初学者理解这一操作,我们将使用C++代码演示具体实现,同... 目录问题定义思路分析代码实现带头节点的链表代码讲解其他实现方式时间和空间复杂度分析总结问题定义给定

Java覆盖第三方jar包中的某一个类的实现方法

《Java覆盖第三方jar包中的某一个类的实现方法》在我们日常的开发中,经常需要使用第三方的jar包,有时候我们会发现第三方的jar包中的某一个类有问题,或者我们需要定制化修改其中的逻辑,那么应该如何... 目录一、需求描述二、示例描述三、操作步骤四、验证结果五、实现原理一、需求描述需求描述如下:需要在

Debezium 与 Apache Kafka 的集成方式步骤详解

《Debezium与ApacheKafka的集成方式步骤详解》本文详细介绍了如何将Debezium与ApacheKafka集成,包括集成概述、步骤、注意事项等,通过KafkaConnect,D... 目录一、集成概述二、集成步骤1. 准备 Kafka 环境2. 配置 Kafka Connect3. 安装 D

Spring AI集成DeepSeek的详细步骤

《SpringAI集成DeepSeek的详细步骤》DeepSeek作为一款卓越的国产AI模型,越来越多的公司考虑在自己的应用中集成,对于Java应用来说,我们可以借助SpringAI集成DeepSe... 目录DeepSeek 介绍Spring AI 是什么?1、环境准备2、构建项目2.1、pom依赖2.2

C++初始化数组的几种常见方法(简单易懂)

《C++初始化数组的几种常见方法(简单易懂)》本文介绍了C++中数组的初始化方法,包括一维数组和二维数组的初始化,以及用new动态初始化数组,在C++11及以上版本中,还提供了使用std::array... 目录1、初始化一维数组1.1、使用列表初始化(推荐方式)1.2、初始化部分列表1.3、使用std::

C++ Primer 多维数组的使用

《C++Primer多维数组的使用》本文主要介绍了多维数组在C++语言中的定义、初始化、下标引用以及使用范围for语句处理多维数组的方法,具有一定的参考价值,感兴趣的可以了解一下... 目录多维数组多维数组的初始化多维数组的下标引用使用范围for语句处理多维数组指针和多维数组多维数组严格来说,C++语言没

c++中std::placeholders的使用方法

《c++中std::placeholders的使用方法》std::placeholders是C++标准库中的一个工具,用于在函数对象绑定时创建占位符,本文就来详细的介绍一下,具有一定的参考价值,感兴... 目录1. 基本概念2. 使用场景3. 示例示例 1:部分参数绑定示例 2:参数重排序4. 注意事项5.

使用C++将处理后的信号保存为PNG和TIFF格式

《使用C++将处理后的信号保存为PNG和TIFF格式》在信号处理领域,我们常常需要将处理结果以图像的形式保存下来,方便后续分析和展示,C++提供了多种库来处理图像数据,本文将介绍如何使用stb_ima... 目录1. PNG格式保存使用stb_imagephp_write库1.1 安装和包含库1.2 代码解

C++实现封装的顺序表的操作与实践

《C++实现封装的顺序表的操作与实践》在程序设计中,顺序表是一种常见的线性数据结构,通常用于存储具有固定顺序的元素,与链表不同,顺序表中的元素是连续存储的,因此访问速度较快,但插入和删除操作的效率可能... 目录一、顺序表的基本概念二、顺序表类的设计1. 顺序表类的成员变量2. 构造函数和析构函数三、顺序表