HarmonyOS ArkUI实战开发-NAPI数据类型

2024-04-22 23:04

本文主要是介绍HarmonyOS ArkUI实战开发-NAPI数据类型,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

在前两篇文章里笔者简单介绍了 NAPI 工程结构以及生成的 cpp 源码部分,其中 JS 应用层传递过来的数据被封装在了 napi_value 中,使用前先要转换成对应的 C/C++ 数据类型,C/C++ 端的数据也要转换成 napi_value 数据类型传递给 JS 应用层,本节笔者简单介绍一下 NAPI 中提供的数据类型转换相关知识点。

NAPI是什么?

NAPI 类似于 Java 里的 JNI,它是 OpenHarmony 系统提供的一套原生模块扩展开发框架,它遵循了 Node.js 的 NAPI 接口规范并在方舟引擎内(ArkNativeEngine)内部做了自有实现,NAPI 为开发者提供了 JS 与 C/C++ 模块之间相互调用的交互能力,交互流程如下图所示:

napi_value数据类型

OpenHarmony NAPI 将 ECMAScript 标准中定义的 Boolean、Null、Undefined、Number、BigInt、String、Symbol和 Object 这八种数据类型以及函数对应的 Function 类型统一封装成了 napi_value 类型,它是 JS 数据类型和 C/C++ 数据类型之间的桥梁,napi_value (opens new window)官网说明如下:

// This is an opaque pointer that is used to represent a JavaScript value.

napi_value 表示 JS 值的不透明指针,在 C/C++ 端要使用 JS 端传递的数据类型,都是通过 NAPI 提供的相关方法把 napi_value 转换成 C/C++ 类型后再使用,同理当需要把 C/C++的数据传递给 JS 应用层也要通过 NAPI 提供的方法把 C/C++ 端的数据转换成 napi_value 再向上传递。

C/C++转napi_value

NAPI提供了 napi_create_ 开头的方法表示把 C/C++ 类型转换成 napi_value 类型,常见方法如下所示:

  • int类型转换
    NAPI_EXTERN napi_status napi_create_int32(napi_env env,int32_t value,napi_value* result);NAPI_EXTERN napi_status napi_create_uint32(napi_env env,uint32_t value,napi_value* result);NAPI_EXTERN napi_status napi_create_int64(napi_env env,int64_t value,napi_value* result);

把 C/C++ 的 int32_tuint32_t 以及 int64_t 类型转换成 napi_value 类型,参数说明如下:

  • env:方法调用者的运行环境,包含 JS 引擎等。
  • value:C/C++端的 int 类型的值。
  • result:napi_value,返回给 JS 应用层的数据。
  • double类型转换
    NAPI_EXTERN napi_status napi_create_double(napi_env env,double value,napi_value* result);

把 C/C++ 端的 double 类型转换成 napi_value 类型,参数说明如下:

*   **env**:方法调用者的运行环境,包含 JS 引擎等。
*   **value**:C/C++ 端的 double 类型的值。
*   **result**:napi_value,返回给 JS 应用层的数据。
  • string类型转换
    NAPI_EXTERN napi_status napi_create_string_latin1(napi_env env,const char* str,size_t length,napi_value* result);NAPI_EXTERN napi_status napi_create_string_utf8(napi_env env,const char* str,size_t length,napi_value* result);NAPI_EXTERN napi_status napi_create_string_utf16(napi_env env,const char16_t* str,size_t length,napi_value* result);

把 C/C++ 端的 char 类型转换成 napi_value 类型,参数说明如下:

  • env:方法调用者的运行环境,包含 JS 引擎等。
  • str:C/C++端的字符串类型的值。
  • size_t:str 的长度。
  • result:napi_value,返回给 JS 应用层的数据。

napi_value转C/C++

NAPI提供了 napi_get_value_ 开头的方法表示把 napi_value 转换成 C/C++ 类型,常见方法如下所示:

  • int类型转换
    NAPI_EXTERN napi_status napi_get_value_int32(napi_env env,napi_value value,int32_t* result);NAPI_EXTERN napi_status napi_get_value_uint32(napi_env env,napi_value value,uint32_t* result);NAPI_EXTERN napi_status napi_get_value_int64(napi_env env,napi_value value,int64_t* result);

把 JS 端的 number 类型转换成 C/C++ 的对应数据类型,参数说明如下:

*   **env**:方法调用者的运行环境,包含 JS 引擎等。
*   **value**:JS 端传递进来的数据。
*   **result**:接收 value 的值。
  • double类型转换
    NAPI_EXTERN napi_status napi_get_value_double(napi_env env,napi_value value,double* result);
把 JS 端的 **number** 类型转换成 C/C++ 的 **double** 类型,参数说明如下:
  • env:方法调用者的运行环境,包含 JS 引擎等。
  • value:JS 端传递进来的数据。
  • result:接收 value 的值。
  • string类型转换
    NAPI_EXTERN napi_status napi_get_value_string_latin1(napi_env env,napi_value value,char* buf,size_t bufsize,size_t* result);// Copies UTF-8 encoded bytes from a string into a buffer.NAPI_EXTERN napi_status napi_get_value_string_utf8(napi_env env,napi_value value,char* buf,size_t bufsize,size_t* result);// Copies UTF-16 encoded bytes from a string into a buffer.NAPI_EXTERN napi_status napi_get_value_string_utf16(napi_env env,napi_value value,char16_t* buf,size_t bufsize,size_t* result);

把 JS 端的 string 类型转换成 C/C++ 的 char 类型,参数说明如下:

*   **env**:方法调用者的运行环境,包含 JS 引擎等。
*   **value**:napi_value,JS 端传递进来的数据。
*   **buf**:char数组,用来存放napi_value中的 string 值
*   **bufsize**:char数组长度
*   **result**:接收 value 的值。
  • boolean类型转换
    NAPI_EXTERN napi_status napi_get_value_bool(napi_env env,napi_value value,bool* result);

把 JS 端的 boolean 类型转换成 C/C++ 的 bool 类型,参数说明如下:

  • env:方法调用者的运行环境,包含 JS 引擎等。
  • value:JS 端传递进来的数据。
  • result:接收 value 的值。

小结

本节笔者简单介绍一下 NAPI 提供的相关 API,读者先对数据转换有个大致的印象,下节笔者将要带领读者通过 NAPI 提供的方法实现一个扩展方法:MD5 加密计算。

码牛课堂也为了积极培养鸿蒙生态人才,让大家都能学习到鸿蒙开发最新的技术,针对一些在职人员、0基础小白、应届生/计算机专业、鸿蒙爱好者等人群,整理了一套纯血版鸿蒙(HarmonyOS Next)全栈开发技术的学习路线。大家可以进行参考学习:https://qr21.cn/FV7h05

①全方位,更合理的学习路径
路线图包括ArkTS基础语法、鸿蒙应用APP开发、鸿蒙能力集APP开发、次开发多端部署开发、物联网开发等九大模块,六大实战项目贯穿始终,由浅入深,层层递进,深入理解鸿蒙开发原理!

②多层次,更多的鸿蒙原生应用
路线图将包含完全基于鸿蒙内核开发的应用,比如一次开发多端部署、自由流转、元服务、端云一体化等,多方位的学习内容让学生能够高效掌握鸿蒙开发,少走弯路,真正理解并应用鸿蒙的核心技术和理念。

③实战化,更贴合企业需求的技术点
学习路线图中的每一个技术点都能够紧贴企业需求,经过多次真实实践,每一个知识点、每一个项目,都是码牛课堂鸿蒙研发团队精心打磨和深度解析的成果,注重对学生的细致教学,每一步都确保学生能够真正理解和掌握。

为了能让大家更好的学习鸿蒙(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://qr21.cn/FV7h05

大厂鸿蒙面试题::https://qr18.cn/F781PH

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

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

这篇关于HarmonyOS ArkUI实战开发-NAPI数据类型的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

Spring Boot集成/输出/日志级别控制/持久化开发实践

《SpringBoot集成/输出/日志级别控制/持久化开发实践》SpringBoot默认集成Logback,支持灵活日志级别配置(INFO/DEBUG等),输出包含时间戳、级别、类名等信息,并可通过... 目录一、日志概述1.1、Spring Boot日志简介1.2、日志框架与默认配置1.3、日志的核心作用

SQL Server跟踪自动统计信息更新实战指南

《SQLServer跟踪自动统计信息更新实战指南》本文详解SQLServer自动统计信息更新的跟踪方法,推荐使用扩展事件实时捕获更新操作及详细信息,同时结合系统视图快速检查统计信息状态,重点强调修... 目录SQL Server 如何跟踪自动统计信息更新:深入解析与实战指南 核心跟踪方法1️⃣ 利用系统目录

java中pdf模版填充表单踩坑实战记录(itextPdf、openPdf、pdfbox)

《java中pdf模版填充表单踩坑实战记录(itextPdf、openPdf、pdfbox)》:本文主要介绍java中pdf模版填充表单踩坑的相关资料,OpenPDF、iText、PDFBox是三... 目录准备Pdf模版方法1:itextpdf7填充表单(1)加入依赖(2)代码(3)遇到的问题方法2:pd

PyQt5 GUI 开发的基础知识

《PyQt5GUI开发的基础知识》Qt是一个跨平台的C++图形用户界面开发框架,支持GUI和非GUI程序开发,本文介绍了使用PyQt5进行界面开发的基础知识,包括创建简单窗口、常用控件、窗口属性设... 目录简介第一个PyQt程序最常用的三个功能模块控件QPushButton(按钮)控件QLable(纯文本

PyTorch中的词嵌入层(nn.Embedding)详解与实战应用示例

《PyTorch中的词嵌入层(nn.Embedding)详解与实战应用示例》词嵌入解决NLP维度灾难,捕捉语义关系,PyTorch的nn.Embedding模块提供灵活实现,支持参数配置、预训练及变长... 目录一、词嵌入(Word Embedding)简介为什么需要词嵌入?二、PyTorch中的nn.Em

详解MySQL中JSON数据类型用法及与传统JSON字符串对比

《详解MySQL中JSON数据类型用法及与传统JSON字符串对比》MySQL从5.7版本开始引入了JSON数据类型,专门用于存储JSON格式的数据,本文将为大家简单介绍一下MySQL中JSON数据类型... 目录前言基本用法jsON数据类型 vs 传统JSON字符串1. 存储方式2. 查询方式对比3. 索引

在IntelliJ IDEA中高效运行与调试Spring Boot项目的实战步骤

《在IntelliJIDEA中高效运行与调试SpringBoot项目的实战步骤》本章详解SpringBoot项目导入IntelliJIDEA的流程,教授运行与调试技巧,包括断点设置与变量查看,奠定... 目录引言:为良驹配上好鞍一、为何选择IntelliJ IDEA?二、实战:导入并运行你的第一个项目步骤1

Spring Boot3.0新特性全面解析与应用实战

《SpringBoot3.0新特性全面解析与应用实战》SpringBoot3.0作为Spring生态系统的一个重要里程碑,带来了众多令人兴奋的新特性和改进,本文将深入解析SpringBoot3.0的... 目录核心变化概览Java版本要求提升迁移至Jakarta EE重要新特性详解1. Native Ima

Spring Boot 与微服务入门实战详细总结

《SpringBoot与微服务入门实战详细总结》本文讲解SpringBoot框架的核心特性如快速构建、自动配置、零XML与微服务架构的定义、演进及优缺点,涵盖开发环境准备和HelloWorld实战... 目录一、Spring Boot 核心概述二、微服务架构详解1. 微服务的定义与演进2. 微服务的优缺点三

SpringBoot集成MyBatis实现SQL拦截器的实战指南

《SpringBoot集成MyBatis实现SQL拦截器的实战指南》这篇文章主要为大家详细介绍了SpringBoot集成MyBatis实现SQL拦截器的相关知识,文中的示例代码讲解详细,有需要的小伙伴... 目录一、为什么需要SQL拦截器?二、MyBATis拦截器基础2.1 核心接口:Interceptor