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

server/2024/12/22 19:32:18/

在前两篇文章里笔者简单介绍了 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.鸿蒙南向开发方向


http://www.ppmy.cn/server/9407.html

相关文章

git报错

这里写自定义目录标题 git报错Permission denied (publickey). fatal: Could not read from remote repository. Please make sure you have the correct access rights and the repository exists. 有一个原因就是在github上设置对应密钥时,有一个key获取应该设置为…

大模型引领未来:探索其在多个领域的深度应用与无限可能【第二章、金融领域:大模型重塑金融生态】

大模型引领未来:探索其在多个领域的深度应用与无限可能【第二章、金融领域:大模型重塑金融生态】 1.智能客服与自动化交易系统的崛起2.风险评估与投资决策的精准化3.客户服务的个性化与智能化4.金融领域大模型清单 1.智能客服与自动化交易系统的崛起 随…

清华大学:序列推荐模型稳定性飙升,STDP框架惊艳登场

获取本文论文原文PDF,请公众号留言:论文解读 引言:在线平台推荐系统的挑战与机遇 在线平台已成为我们日常生活中不可或缺的一部分,它们提供了丰富多样的商品和服务。然而,如何为用户推荐感兴趣的项目仍然是一个挑战。…

汽车4S集团数据分析

派可数据分析--汽车4S集团。 派可数据汽车4S集团数据分析概述。派可数据汽车4S集团分析主题全面涵盖行业内各板块业务分析,具体包括:保险业务分析、客户关系分析、汽车保养情况分析、售后维修主题分析、整车销售分析、整车库存分析、装具销售分析、配件…

什么是Lua模块?你会如何使用NGINX的Lua模块来定制请求处理流程?

Lua模块是NGINX的一个扩展,允许你使用Lua编程语言在NGINX配置中嵌入自定义的脚本逻辑。通过使用Lua模块,你可以在请求处理过程中执行自定义的操作,从而实现灵活的定制和扩展。 Lua模块在NGINX中提供了以下功能: 请求处理&#xff…

NumPy:深度学习领域的强大工具

NumPy在深度学习领域是一个强大的工具,它主要用于数值计算、数组操作以及线性代数运算等。尽管深度学习框架(如TensorFlow和PyTorch)已经内置了这些功能,但在一些底层操作或数据处理任务中,NumPy仍然发挥着重要的作用。…

Git说明

Git git介绍 分布式文件版本控制系统 分布式:将数据进行拆分,部署到不同服务器中,数据独立 版本控制:记录文件的改动,形成版本历史,以便需要时恢复 git的作用 代码共享 回溯版本 追踪信息 git的组成 工作区(电脑上的目录) 版本库(git创建的.git隐藏文件) 暂存区 本…

Git 新手快速入门教程

一、什么是 Git 1. 何为版本控制 版本控制是一种记录文件变化的系统,可以跟踪文件的修改历史,并允许用户在不同版本之间进行比较、恢复或合并。它主要用于软件开发过程中管理代码的变更,但也可以应用于任何需要跟踪文件变更的场景。 版本控…