【HarmonyOS NAPI 深度探索7】N-API 数据处理:与 JavaScript 数据的交互 ...

打印 上一主题 下一主题

主题 859|帖子 859|积分 2579

【HarmonyOS NAPI 深度探索7】N-API 数据处理:与 JavaScript 数据的交互

在开发原生模块时,一个核心的需求就是与 JavaScript 数据交互。N-API 提供了丰富的工具,让你能够方便地处理各种类型的数据,从根本的字符串、数字到复杂的对象和数组。本文我们将通过实例化讲解如何在 N-API 中进行数据处理。
N-API 支持的基本数据类型

N-API 支持多种 JavaScript 数据类型的创建和操作,包括:

  • 基本类型:如字符串、数字、布尔值等。
  • 复合类型:如对象、数组、函数等。
  • 特别类型:如 Promise、Buffer、Date 等。
通过 N-API,可以轻松实现这些类型的相互转换和操作。
与 JavaScript 数据交互的基本操作

在 N-API 中,数据处理主要通过 Napi 定名空间提供的类和方法完成。下面通过几个具体示例来展示如何操作各种数据类型。
示例 1:处理字符串

字符串是最常用的数据类型之一。以下代码展示了如何在原生模块中吸取字符串参数,并返回一个处理后的结果:
  1. #include <napi.h>
  2. Napi::String ProcessString(const Napi::CallbackInfo& info) {
  3.     Napi::Env env = info.Env();
  4.     if (info.Length() < 1 || !info[0].IsString()) {
  5.         Napi::TypeError::New(env, "String expected").ThrowAsJavaScriptException();
  6.         return Napi::String::New(env, "");
  7.     }
  8.     std::string input = info[0].As<Napi::String>();
  9.     std::string result = "Hello, " + input;
  10.     return Napi::String::New(env, result);
  11. }
  12. Napi::Object Init(Napi::Env env, Napi::Object exports) {
  13.     exports.Set("processString", Napi::Function::New(env, ProcessString));
  14.     return exports;
  15. }
  16. NODE_API_MODULE(napi_example, Init)
复制代码
运行以下测试代码:
  1. const addon = require('./build/Release/napi_example');
  2. console.log(addon.processString("HarmonyOS")); // 输出:Hello, HarmonyOS
复制代码
这里主要通过Napi::String::New 创建TS字符串,然后返回给TS。
示例 2:处理数字

N-API 也可以用来吸取和返回数字。例如,我们可以实现一个简朴的加法函数:
  1. Napi::Number AddNumbers(const Napi::CallbackInfo& info) {
  2.     Napi::Env env = info.Env();
  3.     if (info.Length() < 2 || !info[0].IsNumber() || !info[1].IsNumber()) {
  4.         Napi::TypeError::New(env, "Two numbers expected").ThrowAsJavaScriptException();
  5.         return Napi::Number::New(env, 0);
  6.     }
  7.     double num1 = info[0].As<Napi::Number>().DoubleValue();
  8.     double num2 = info[1].As<Napi::Number>().DoubleValue();
  9.     return Napi::Number::New(env, num1 + num2);
  10. }
复制代码
通过以下代码测试:
  1. const addon = require('./build/Release/napi_example');
  2. console.log(addon.addNumbers(5, 3)); // 输出:8
复制代码
示例 3:处理对象

N-API 答应你操作 JavaScript 对象,可以创建对象或访问和修改其属性:
  1. Napi::Object CreateObject(const Napi::CallbackInfo& info) {
  2.     Napi::Env env = info.Env();
  3.     Napi::Object obj = Napi::Object::New(env);
  4.     obj.Set("name", "HarmonyOS");
  5.     obj.Set("version", 1.0);
  6.     return obj;
  7. }
复制代码
测试代码:
  1. const addon = require('./build/Release/napi_example');
  2. console.log(addon.createObject()); // 输出:{ name: 'HarmonyOS', version: 1 }
复制代码
示例 4:处理数组

数组的操作同样简朴,可以创建数组或访问其元素:
  1. Napi::Array CreateArray(const Napi::CallbackInfo& info) {
  2.     Napi::Env env = info.Env();
  3.     Napi::Array arr = Napi::Array::New(env);
  4.     arr.Set(uint32_t(0), "Harmony");
  5.     arr.Set(uint32_t(1), "OS");
  6.     arr.Set(uint32_t(2), "NAPI");
  7.     return arr;
  8. }
复制代码
测试代码:
  1. const addon = require('./build/Release/napi_example');
  2. console.log(addon.createArray()); // 输出:[ 'Harmony', 'OS', 'NAPI' ]
复制代码
示例 5:异步数据处理

N-API 也支持异步数据处理,可以通过 Promise 将原生操作结果返回到 JavaScript:
  1. Napi::Value AsyncOperation(const Napi::CallbackInfo& info) {
  2.     Napi::Env env = info.Env();
  3.     return Napi::Promise::Deferred::New(env).Promise();
  4. }
复制代码
异步操作的具体实现可以结合线程池或变乱循环完成。
napi.h与node_api.h

文本使用的api都是基于napi.h头文件提供的接口,napi.h依赖node_api.h,在HarmonyOS Next开发中用到node_api.h相关方法,后面会逐步介绍。这里简朴阐明一下两个头文件的区别。


  • npai.h

    • -napi.h是 Node.js 的 N - API(Node.js API for Native Modules)的头文件。N - API 是一个用于构建原生 Node.js 模块的稳定 ABI(Application Binary Interface)层。
    • 它的主要目的是提供一个稳定的接口,使得原生模块可以在差异版本的 Node.js 运行时上无需重新编译就能工作。例如,当 Node.js 从版本 12 升级到版本 14 时,如果一个原生模块是使用 N - API 编写的(通过napi.h),只要该模块使用的 N - API 版本在两个 Node.js 版本中都受支持,就可以继承正常使用,而不必要修改和重新编译代码。
    • N - API 抽象了 Node.js 的内部实现细节,开发者可以使用一组标准化的函数来操作 JavaScript 值、创建对象、调用函数等。例如,napi_create_object函数可以用于在原生代码中创建一个 JavaScript 对象,这种操作方式在差异的 Node.js 版本中是相对稳定的。

  • node_api.h

    • node_api.h在早期的 Node.js 原生模块开发中被使用。它与napi.h相比,没有提供像 N - API 那样稳定的 ABI。
    • 其接口与 Node.js 内部的 JavaScript 运行时(如 V8 引擎)的联系更紧密,并且可能会因为 Node.js 内部实现的变革而发生改变。例如,在 Node.js 版本升级过程中,如果 V8 引擎的某些底层接口发生了修改,使用node_api.h编写的原生模块可能必要进行相应的调整和重新编译才能继承正常工作。
      在napi项目中napi.h头文件位于node_modules下面:


总结

N-API 提供了一套强盛的 API,支持与 JavaScript 各种数据类型的交互。无论是字符串、数字这样的简朴类型,还是对象、数组这样的复杂类型,甚至是异步数据处理,N-API 都能轻松应对。通过这些工具,你可以将复杂的底层逻辑封装到原生模块中,并在 JavaScript 中方便地调用它们。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

用多少眼泪才能让你相信

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表