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

发布于:2024-04-26 ⋅ 阅读:(24) ⋅ 点赞:(0)

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