Harmony next Native API 开发工程实践

news2024/11/17 7:44:25

旨在通过文档,了解华为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.coloradmin.cn/o/2169887.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

从耐用到防水:全面综合评估SD卡的性能指标

SD卡(Secure Digital Memory Card)是一种广泛使用的存储器件,因其快速的数据传输速度、可热插拔的特性以及较大的存储容量,广泛应用于各种场景,例如在便携式设备如智能手机、平板电脑、运动相机等,用于存储…

Docker镜像、Spark支持多表...Apache SeaTunnel 2.3.8版本将带来的惊喜

Apache SeaTunnel 2.3.8版本即将于大家见面,近日,Apache SeaTunnel PMC Member 范佳在社区的交流会上为大家提前透露了关于这个新版本即将进行的功能与特性更新概况,详细内容如下: SeaTunnel 简介 SeaTunnel是一个高性能的开源分…

【生物服务器】DAP-seq与H3K4me3 ChIP-seq服务,推动表观遗传学研究的创新工具

查看全文>>>探索基因调控新维度:汇智生物的DAP-seq与H3K4me3 ChIP-seq服务,推动表观遗传学研究的创新工具与合作案例 北京汇智精研生物科技由毕业于中国科学院、北京大学肿瘤医院、中国农科院、中国农业大学等科研院所的国家高精尖人才发起&…

计算机网络--HTTP协议

1.TCP,UDP的对比图 TCP:面向连接的,可靠的,字节流服务; UDP:无连接的,不可靠的,数据报服务; 2.补充网络部分的其他知识点 1).复位报文段 在某些特殊条件下, TCP 连接的一端会向另一端发送携带 RST 标志的报文段,即复位报文段,已通知对方…

【通知】“长三角档案数字资源长期保存与数据安全治理”专题培训

关注我们 - 数字罗塞塔计划 - 为加强长三角地区档案数字资源长期安全管理,提升档案管理人员档案信息化水平和实务技能,推动长三角地区档案数字化转型向纵深发展,上海市档案服务和教育中心将于近期举办“长三角档案数字资源长期保存与数据安全…

【裸机装机系列】16.kali(ubuntu)-安装linux和win双系统-重装win11步骤

推荐阅读: 1.kali(ubuntu)-为什么弃用ubuntu,而选择基于debian的kali操作系统 注意: 要先装windows,再装linux,不然linux的启动分区会被覆盖掉。为什么双系统要先装windows呢? 在一个新硬盘上&#xff0…

旺店通ERP集成金蝶K3(金蝶K3主供应链)

源系统成集云目标系统 金蝶K3介绍 金蝶K3是一款ERP软件,它集成了供应链管理、财务管理、人力资源管理、客户关系管理、办公自动化、商业分析、移动商务、集成接口及行业插件等业务管理组件。以成本管理为目标,计划与流程控制为主线,通…

原生APP与其他类型APP的对比

移动应用主要分为原生APP、混合APP和Web APP三种。每种类型都有其独特的优势和局限性。 原生APP 优点:性能卓越: 直接调用设备硬件,运行流畅,用户体验最佳。用户界面定制化程度高: 可以充分利用平台的UI组件&#xff…

SD卡认识——SDIO协议入门与实践(一)

最初是三年前,接手开发sdio裸机驱动和测试用例的工作,内容很多,一开始就是各种在官网、各大论坛以及开源的驱动和例程里学习,简单浏览了sdio控制器、SD卡、MMC、SDIO卡等协议,然后就是开干;鉴于sdio协议还是…

Java GC:GC算法、GC回收器、GC日志

文章目录 基本概念垃圾回收类型垃圾回收算法垃圾回收器 VM参数设置控制vm参数内存参数GC参数 GC实例分析 基本概念 垃圾回收类型 Minor GC:对新生代进行的垃圾回收,所以也叫Young GCMajor GC:对老年代进行的垃圾回收,所以也叫Old GCFull GC:对整个Java…

无人机的作战指挥中心-地面站!

无人机与地面站的关系 指挥与控制:地面站是无人机系统的核心控制部分,负责对无人机进行远程指挥和控制。无人机根据地面站下达的任务自主完成飞行任务,并实时向地面站反馈飞行状态和任务执行情况。 任务规划与执行:地面站具备任…

Laravel部署后,CPU 使用率过高

我在部署 Laravel 应用程序时遇到严重问题。当访问量稍微大一点的时候,cpu马上就到100%了, 找了一大堆文档和说明,都是说明laravel处理并发的能力太弱,还不如原生的php。最后找到swoole解决问题。 1、php下载swoole插件&#xff0…

智能监控,守护绿色能源:EasyCVR在电站视频监控中心的一站式解决方案

随着科技的飞速发展,视频监控技术在社会安全、企业管理及智慧城市建设等领域中扮演着越来越重要的角色。特别是在电力行业中,电站作为能源供应的关键设施,其安全性和稳定性至关重要。传统的人工监控方式已难以满足现代电站复杂多变的运行需求…

Sql Server时间转换之查询时间格式不对--CONVERT(NVARCHAR,CreateTime,23) 转换出来有时分秒

错误:CONVERT(NVARCHAR,CreateTime,23) 转换出来有时分秒 SELECT TOP 10 CONVERT(NVARCHAR,CreateTime,23) FROM table A 解决办法:限制转换的字符串长度 SELECT TOP 10 CONVERT(NVARCHAR(10),CreateTime,23) FROM table A

Android 通过自定义注解实现Activity间跳转时登录路由的自动拦截

应用场景 在Android 中部分软件需要登录才能使用,但是有的页面又不需要登录,Android不同于Web可以直接拦截重定向路由,因此如果在Android中如果需要检测是否登录,如果没登录跳转登录的话就需要再每个页面中判断,当然也…

不会写SD WebUI 的负面提示词?用这几款Embedding模型一键搞定!效果好到爆炸!

文章目录 一、Embedding 模型简介二、负面提示词 Embedding三、Embedding 资源下载四、Embedding 安装与使用关于AI绘画技术储备零基础AI绘画学习资源介绍👉stable diffusion新手0基础入门PDF👈👉AI绘画必备工具👈👉AI…

MySQL重点,面试题

一、 聚合函数 分类 COUNT:统计行数量SUM:获取单个列的合计值AVG:计算某个列的平均值MAX:计算列的最大值MIN:计算列的最小值 二、SQL关键字 分页:limit SELECT * FROM student limit 100,6; 倒序 desc s…

数据结构 ——— 移除 nums 数组中的 val 元素(快慢指针)

目录 题目要求 代码实现(快慢指针) 题目要求 编写函数,给你一个数组 nums 和一个值 val,你需要在 nums 数组 原地 移除所有数值等于 val 的元素,并且返回移除后数组的新长度 不能使用额外的数组空间,要…

11.全面学习面向对象技术

面向对象开发 相关概念 对象:由数据及其操作所构成的封装体,是系统中用来描述客观事务的一个实体,是构成系统的一个基本单位。一个对象通常可以由对象名、属性和方法3个部分组成。类:现实世界中实体的形式化描述,类…

MySQL_插入、更新和删除数据

课 程 推 荐我 的 个 人 主 页:👉👉 失心疯的个人主页 👈👈入 门 教 程 推 荐 :👉👉 Python零基础入门教程合集 👈👈虚 拟 环 境 搭 建 :&#x1…