当前位置: 首页 > article >正文

Harmony next Native API 开发工程实践

旨在通过文档,了解华为native开发中的关键节点,能够搭建一个比较实用的native功能、

目录

前言

一、napi是什么?

二、简单开始一个napi的实例

1.适配架构配置

2.新增实现

3.官方实例

4.napi与ark通讯的几种方式

Native侧的CallNative

Native call arkts

过程问题

llvm对机器的要求

napi 对比nodejs、android - ndk实现的差异

字典

Nativie API / NDK

SDK CAPI


前言

        harmony next Native Api实践第一课

一、napi是什么?

ohos上谈论napi是因为,底层部分能力从node-api/napi上实现而来,部分能力跟napi本身有差异,从实际开发中来看,复用度较高。从napi向上实现,一个关键的优势在于本身napi是去除了底层的javascript引擎的差异,提供了一套稳定的接口;同时,arkts是ts的超集,node-js生态友好的napi是更好的选择。(napi在nodejs上更多的做插件开发,市面上相关实战、文章较少,这对开发者提了更高的要求)。

华为部分对napi的接口进行重新的实现,底层对接了ArkJS引擎,支持的napi标准库的部分接口:

https://developer.huawei.com/consumer/cn/doc/harmonyos-references-V1/napi-0000001630425921-V1

Ark Node-api 支持数据类型与接口:

https://developer.huawei.com/consumer/cn/doc/harmonyos-guides/napi-data-types-interfaces-0000001820880433

node-js官网部分对node api的接口定义

https://nodejs.cn/api/n-api.html

简单对比下,在node-js定义接口上,相关文档更详细、解释更详尽,华为部分简单进行了接口的梳理。更大的native建设力度放在了原生支持、opengl部分。对于端上同学来实现另一套napi实现的方式,除了要从ndk的api切换到napi中,还需要注意napi不等于ohos的native api,实际中有差异的部分需要边调试边看底层实现。受制于市面并没有比较活跃的napi相关社区、成熟库示例,投入需要提前预估到。

二、简单开始一个napi的实例

File -> createProject -> native c++ 新建项目之后,简单操作不赘述。针对实战示例来梳理在新建项目到实战需要进行哪些了解。

harmony中的工程目录与native实现:

https://developer.huawei.com/consumer/cn/doc/harmonyos-guides/use-napi-process-0000001774120794

1.适配架构配置

  build-profile.json5

"externalNativeOptions": {
  "path": "./src/main/cpp/CMakeLists.txt",
   //make 参数
  "arguments": "-v -DOHOS_STL=c++_shared",
  "abiFilters": [
     //添加适配架构
    "arm64-v8a",
    "armeabi-v7a",
    "x86_64"
  ],
  "cppFlags": ""
}

2.新增实现

新增cpp/types/common文件夹,添加common.h文件,cmakelist.txt文件添加

add_library( 
    your_lib_name  // lib name 
    SHARED  
    types/common/common.h  //新增实现代码位置
)

该处使用的url网络请求的数据。

3.官方实例

https://developer.huawei.com/consumer/cn/

codelabsPortal/carddetails/tutorials_NaitveTemplate

4.napi与ark通讯的几种方式

napi_value scriptResult;
// 构造 SHA-1 加密的 JavaScript 代码
std::string sha1Code = "import { CryptoJS } from '@ohos/crypto-js'; let result2:string = "";result2 = CryptoJS.SHA1('message');result2;";
napi_value scriptString; 
napi_create_string_utf8(env, sha1Code.c_str(), NAPI_AUTO_LENGTH ,&scriptString);
// 执行 JavaScript 代码
napi_status scriptStatus = napi_run_script(env,scriptString , &scriptResult);

if (scriptStatus != napi_ok) {
    safe2_string.append("Failed to execute JavaScript code");
}else{
    safe2_string.append("\n脚本运行的结果: ");
    safe2_string.append(napiValueToString(env, scriptResult));
    safe2_string.append("\n脚本运行的结果: ending \n");
}

Native侧的CallNative

// ark调用native能力 ,通过上层引入so库、ark调用native能力来实现
static napi_value CallNative(napi_env env, napi_callback_info info)
{
    size_t argc = 2;
    // 声明参数数组
    napi_value args[2] = {nullptr};

    // 获取传入的参数并依次放入参数数组中
    napi_get_cb_info(env, info, &argc, args, nullptr, nullptr);

    // 依次获取参数
    double value0;
    napi_get_value_double(env, args[0], &value0);
    double value1;
    napi_get_value_double(env, args[1], &value1);

    // 返回两数相加的结果
    napi_value sum;
    napi_create_double(env, value0 + value1, &sum);
    return sum;
}

Native call arkts

// native 处理逻辑,通过callback回调到ark内。
static napi_value NativeCallArkTS(napi_env env, napi_callback_info info)
{    
    size_t argc = 1;
    // 声明参数数组
    napi_value args[1] = {nullptr};

    // 获取传入的参数并依次放入参数数组中
    napi_get_cb_info(env, info, &argc, args , nullptr, nullptr);

    // 创建一个int,作为ArkTS的入参
    napi_value argv = nullptr;    
    napi_create_int32(env, 2, &argv );

    // 调用传入的callback,并将其结果返回
    napi_value result = nullptr;
    napi_call_function(env, nullptr, args[0], 1, &argv, &result);
    return result;
}

过程问题

llvm对机器的要求

针对ndk生成的so库,需通过harmony提供的llvm进行重新生成:

https://gitee.com/openharmony/docs/blob/master/zh-cn/release-notes/OpenHarmony-v4.0-release.md#https://gitee.com/link?target=https%3A%2F%2Frepo.huaweicloud.com%2Fopenharmony%2Fos%2F4.0-Release%2Fohos-sdk-mac-public.tar.gz

harmony部分,mac支持机器暂时只有mac老款、mac m1,新款部分暂无工具库。

mac老款需要升级系统,升级安装xcode_command_line工具,升级安装ld.lld工具库(llvm系统依赖)。

非harmony库动态库,线上预编译库-https://conan.io/

编译中问题参考 - https://juejin.cn/post/7295276751595339828

编译多个linux包

napi 对比nodejs、android - ndk实现的差异

已有ndk库的改写,需要同时注意ndk与ohos - napi、 napi的差异。在nodejs napi部分标准实现需要对标ohos实现,未完全对齐部分需要适配。 Android ndk部分数据类型、通讯、声明、cmake、llvm编译、依赖、架构都有比较大的差异。


字典

Nativie API / NDK

OHOS SDK里面native包提供的,面向三方应用开发的Native 接口以及相应编译脚本,编译工具链。包括C运行时基础库libc,3D图形库opengl,面向JS与C跨语言的接口Node-API。 NDK - Native Develop Kit的缩写,在OHOS上就是Native API;Native API是官方名字,NDK指代相同意思。

SDK CAPI

OHOS Native API中的C语言接口,以及工具链部分,当前OHOS的Native API里面只包含C语言接口,因此Native API与CAPI意思一样,建议交流的时候使用CAPI,防止Native API与napi缩写混用。

Node-API / napi

曾用名napi,是OHOS中提供JS与C跨语言调用的接口,是Native API接口中的一部分. 该接口在Node.js提供的Node-API基础上扩展而来,但不完全与Node.js中的Node-API完全兼容。


http://www.kler.cn/news/326193.html

相关文章:

  • Python数据分析工具:Seaborn用法示例
  • UI设计师面试整理-面向用户的设计
  • k8s pv(PersistentVolume) 状态含义
  • 全自动ai生成视频MoneyPrinterTurbo源码 在线ai生成视频源码
  • 【艾思科蓝】网络安全的隐秘战场:构筑数字世界的铜墙铁壁
  • 66 使用注意力机制的seq2seq_by《李沐:动手学深度学习v2》pytorch版
  • 生产者和消费者
  • WinRAR技巧:如何给多个压缩包设置同一个密码
  • 09_React 扩展
  • 网络安全:保护您的数字世界
  • 基于单片机电容测量仪仿真设计
  • 基于大数据的高校新生数据可视化分析系统
  • 华为源NAT技术与目的NAT技术
  • unity 打包安卓 RenderTexture显示红色
  • 命令回显echo
  • SpringBoot使用@Slf4j注解实现日志输出
  • uniapp数据缓存
  • golang学习笔记20-面向对象(二):方法与结构体【重要】
  • React和Vue对比
  • Oracle数据库物理结构操作管理
  • kubeadm部署k8s集群,版本1.23.6;并设置calico网络BGP模式通信,版本v3.25--未完待续
  • C++ STL(1)迭代器
  • Kafka 在 Linux 下的集群配置和安装
  • 生产k8s 应用容器内存溢出OOMKilled问题处理
  • Ubuntu 镜像替换为阿里云镜像:简化你的下载体验
  • linux内核双向链表使用list klist
  • YOLOv11改进策略【注意力机制篇】| 添加SE、CBAM、ECA、CA、Swin Transformer等注意力和多头注意力机制
  • L2-004 这是二叉搜索树吗?
  • C++中vector类的使用
  • Google Tag Manager - 服务器端代码植入