如何使用DevEco Studio创建Native C++应用

news/2024/4/20 10:15:56/文章来源:https://blog.csdn.net/OpenHarmony_dev/article/details/129158292

简介

本篇主要介绍如何使用DevEco Studio for OpenAtom OpenHarmony (以下简称“OpenHarmony”)创建一个Native C++应用。应用采用“Native C++”模板,实现了通过Node-API调用C标准库的功能。本示例通过调用C标准库接口来演示调用过程,具体接口是C标准库的计算两个给定数和,并将结果返回到页面展示。通过这个应用我们可以掌握OpenHarmony系统的ArkTS/JS与C/C++混合开发。ArkTS/JS与C/C++ 混合开发是OpenHarmony系统中的一套原生模块扩展开发框架,它基于Node.js N-API规范开发,为开发者提供了ArkTS/JS与C/C++模块之间相互调用的交互能力。这套机制对于OpenHarmony系统开发的价值有两方面:

1、OpenHarmony系统可以将框架层丰富的模块功能通过js接口开放给上层应用使用。

2、应用开发者也可以选择将一些对性能、底层系统调用有要求的核心功能用C/C++封装实现,再通过js接口使用,提高应用本身的执行效率。

效果图

实现效果如下图所示:

通过ArkTS编写界面,根据界面展示点击输入框输入两个数,再点击计算按钮调用接口,将数据传入到C++端,C++端计算后再作为返回值到ArkTS端。

环境搭建

我们首先要完成应用开发环境的搭建,本示例运行RK3568开发板上。

1、 搭建应用开发环境

1.1、开始前请参考应用开发快速上手链接,完成DevEco Studio的安装和开发环境配置:参考链接

1.2、开发环境配置完成后,创建工程(模板选择“Native C++”),选择JS或者eTS语言开发。

2、应用调测

工程创建完成后,选择使用真机进行调测。

2.1、将搭载OpenHarmony标准系统的开发板与电脑连接。

2.2、点击File> Project Structure... > Project>SigningConfigs界面勾选“Automatically generate signature”,等待自动签名完成即可,最后点击“OK”。如下图所示:

在编辑窗口右上角的工具栏,点击

按钮运行。

源码结构

代码结构分析,整个工程的代码结构如下:

文件说明如下:

├── cpp:// C++代码区│   ├── types:// 接口存放文件夹│   │   └── libadd              │   │       ├── index.d.ts       // 接口文件│   │       └── package.json // 接口注册配置文件│   ├── CmakeList.text     // Cmake打包配置文件│   └── add.cpp                // C++源代码└── ets                               // ets代码区    └── Application    │   └── AbilityStage.ts  // Hap包运行时类    ├── MainAbility    │   └── MainAbility.ts   //对Ability生命周期管理    └── pages        └── index.ets            // 主页面

C++端方法实现

C++端方法源码是工程的entry/src/main/cpp/add.cpp文件。

1、 注册模块

先定义一个模块,对应结构体为napi_module,模块定义好后,调用NAPI提供的模块注册函数napi_module_register(napi_module* mod)注册到系统中;参考如下示例,nm_modname可以根据实际情况修改。

static napi_module demoModule = {    .nm_version =1,    .nm_flags = 0,    .nm_filename = nullptr,    .nm_register_func = Init,    .nm_modname = "libadd",    .nm_priv = ((void*)0),    .reserved = { 0 },};extern "C" __attribute__((constructor)) void RegisterHelloModule(void){    napi_module_register(&demoModule);}

2、 接口定义

接口定义是固定写法,在napi_property_descriptor desc[]中,我们需要将编写的“hyPotC”方法(从左至右第三个参数)与对应暴露的接口“hyPot”接口(从左至右第一个参数)进行关联,其他参考示例默认填写即可。如下所示,其中Add对应的是Native C++的接口,其应用端的接口对应为add,NAPI通过napi_define_properties接口将napi_property_descriptor结构体中的2个接口绑定在一起,并通过exports变量对外导出,使应用层可以调用add方法。

EXTERN_C_STARTstatic napi_value Init(napi_env env, napi_value exports){    napi_property_descriptor desc[] = {        { "add", nullptr, Add, nullptr, nullptr, nullptr, napi_default, nullptr }    };    napi_define_properties(env, exports, sizeof(desc) / sizeof(desc[0]), desc);    return exports;}EXTERN_C_END

3、 接口实现

#include "napi/native_api.h"static napi_value Add(napi_env env, napi_callback_info info){    size_t requireArgc = 2;    size_t argc = 2;    napi_value args[2] = {nullptr};    napi_get_cb_info(env, info, &argc, args , nullptr, nullptr);    napi_valuetype valuetype0;    napi_typeof(env, args[0], &valuetype0);    napi_valuetype valuetype1;    napi_typeof(env, args[1], &valuetype1);    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;}

4、 接口对外配置

4.1、修改index.d.ts用于对外提供方法、说明(名字可以更改,点击方法可以直接链接到index.d.ts)。

export const add: (a: number, b: number) => number;

4.2、在package.json文件中将index.d.ts与cpp文件关联起来。

{  "name": "libadd.so",  "types": "./index.d.ts"}

4.3、CMakeLists.txt配置CMake打包参数,CMakeLists.txt是CMake打包的配置文件,里面的大部分内容无需修改,project、add_library方法中的内容可以根据实际情况修改。

# the minimum version of CMake.cmake_minimum_required(VERSION 3.4.1)project(MyApplication)set(NATIVERENDER_ROOT_PATH ${CMAKE_CURRENT_SOURCE_DIR})include_directories(${NATIVERENDER_ROOT_PATH}                    ${NATIVERENDER_ROOT_PATH}/include)add_library(add SHARED add.cpp)target_link_libraries(add PUBLIC libace_napi.z.so)

ArkTS端实现

界面整体规划效果如下图所示:

界面实现部分代码,具体请查看源码(见参考链接源码路径)。

@Entry@Componentstruct Index {  ...  build() {    Row() {      Column() {      }      .width('100%')    }    .height('100%')  }}

ArkTS调用C++方法流程

在ArkTS调用C++流程的过程中,需要使用到Node_API、Cmake等工具来做中间转换,整个流程如下:

(1) add.cpp源码用来编写C++代码,并通过index.d.ts文件对外提供接口。

(2) C++代码通过Cmake打包工具打包成动态链接库SO文件。

(3) arkTs端index.ets源码通过引入SO包的方式去调用SO文件中的接口,最终通过hivgor一起打包成可执行的xxx.hap包。

1、导入SO包

在index.ets文件中引入编译好的SO包。

import libAdd from 'libadd.so'

2、添加点击事件

Button组件添加点击事件,调用libadd.so中的方法。

Button(this.buttonSubmit)    .fontSize(40)    .fontWeight(FontWeight.Bold)    .margin({top:5})    .height(100)    .width(200)    .onClick(() => {        this.result = libAdd.add(this.num1,this.num2) })

3、hivgor打包

hivgor打包将SO文件与eTS代码一起打包成hap包。

4、安装hap包

点击

按钮安装hap包运行。

总结

通过本篇介绍,我们了解了C++代码如何与ArkTS实现关联,ArkTS如何调用SO包中的接口等,同时也掌握了C++代码的具体编写与打包流程。

参考链接

DevEco Studio安装和开发环境配置

https://gitee.com/openharmony/docs/blob/master/zh-cn/application-dev/quick-start/start-overview.md#%E5%B7%A5%E5%85%B7%E5%87%86%E5%A4%87

源码路径

https://gitee.com/openharmony-sig/knowledge/tree/knowledge/typical_demo/NativeApp

NAPI课程学习路径

https://gitee.com/openharmony-sig/knowledge_demo_temp/tree/master/docs/napi%E7%B3%BB%E5%88%97%E5%AD%A6%E4%B9%A0

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_72427.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

MES助力灯具照明行业从制造到”智造”

现如今,LED照明行业产品更新换代太快,一个产品一两年不更新一下外观、材料,就会被对手超越。这直接导致LED产品标准化程度不够高,LED下游制造类厂家智能化生产程度普遍偏低。 加之大多属于劳动密集型产业,传统的依靠买…

less、sass、webpack(前端工程化)

目录 一、Less 1.配置less环境 1.先要安装node:在cmd中:node -v检查是否安装node 2.安装less :cnpm install -g less 3.检查less是否安装成功:lessc -v 4.安装成功后,在工作区创建xx.less文件 5.在控制台编译less,命令&…

Ubuntu16.04使用apache创建个人用户主页并添加口令认证

文章目录一.安装apache二、apache文件和目录简述2.1 网站数据目录2.2 Apache配置文件三、创建个人用户主页3.1 开启个人用户主页功能3.2 建立目录和首页面3.3 开启模块3.4 测试四、添加口令认证4.1 生成密码数据库4.2 修改配置文件一.安装apache 创建虚拟机,保持默…

Python socket之TCP通信、下载文件

TCP简介TCP介绍TCP协议,传输控制协议(英语:Transmission Control Protocol,缩写为 TCP)是一种面向连接的、可靠的、基于字节流的传输层通信协议,由IETF的RFC 793定义。TCP通信需要经过创建连接、数据传送、…

深入浅出深度学习Pytroch

本文将以通俗易懂的方式,深入浅出地为您揭开深度学习模型构建与训练的面纱: 深度学习数据data模型model损失函数loss优化optimizer可视化visualizer深度学习 数据data 模型model 损失函数loss 优化optimizer 可视化visualizer深度学习数据data模型m…

如何写新闻稿?写好新闻稿的技巧与步骤

新闻稿是传递新闻事件和信息的重要手段,是传媒工作中不可或缺的一部分。写好一篇新闻稿可以让受众了解更多信息,进一步提高他们的关注度。以下是一些写好新闻稿的技巧和步骤,帮助你有效地传达新闻。1、确定新闻的核心信息在开始写新闻稿之前&…

短链或H5唤醒(跳转)APP应用

唤醒APP(两种方法) 一.短链唤醒(跳转)app ⭐ 短链跳转到APP,当如果用户手机不存在APP(某个应用)将会进入到官网页面。 app links实现 在android studio菜单栏Tools->App Links Ass点击,效果图如下 2.配置如下 点击ok,生成如下效果图 3.完成第二步后,会自动…

FreeRTOS入门(01):基础说明与使用演示

文章目录目的基础说明系统移植基础使用演示数据类型和命名风格总结碎碎念目的 FreeRTOS是一个现在非常流行的实时操作系统(Real Time Operating System)。本文将介绍FreeRTOS入门使用相关内容,这篇是第一篇,主要介绍基础背景方面…

【论文阅读】Anti-Adversarially Manipulated Attributions for WSSS

一篇CVPR2021上的论文,用于弱监督分割及半监督分割 论文标题: Anti-Adversarially Manipulated Attributions for Weakly and Semi-Supervised Semantic Segmentation(AdvCAM) 作者信息: 代码地址: htt…

2023年华为HCIE-Dacom认证题库(H12-891)

1、如图所示是某位网络工程师在排查OSPF故障时的输出信息。据此判断,以下哪种原因可能导致邻接关系无法正常建立。 Hello报文发送时间不一致认证密码不一致接口的IP地址掩码不一致区域类型不一致 正确答案:C 2、如图所示,路由器的所有接口开启…

ATTCK实战系列——红队实战(二)

网络配置 网卡: WEB: PC: DC: IPWEB10.10.10.80(内)/192.168.111.80(外)PC10.10.10.201(内)/192.168.111.201(外)DC10.10.10.10物理机…

C++线程/阻塞/同步异步----2

本章节内容为记录改写RTK代码时,学习的知识 同步和异步区别 1.定义不同:同步需要将通信双方的时钟统一到一个频率上,异步通信发送的字符间隔时间可以是任意的; 2.准确性不同:同步通信需要比较高精度的精确度,异步则不…

5.12 BGP选路原则综合实验

配置BGP的选路原则 1. 实验目的 熟悉BGP的选路的应用场景掌握BGP的选路的配置方法2. 实验拓扑 实验拓扑如图5-11所示: 图5-11:配置BGP的选路原则 3. 实验步骤 (1)配置IP地址 R1的配置

你知道 GO 中的 协程可以无止境的开吗?

GO语言天生高并发的语言&#xff0c;那么是不是使用 go 开辟协程越多越好的&#xff0c;那么在 go 里面&#xff0c;协程是不是可以开无限多个呢&#xff1f; 那么我们就一起来看看尝试写写 demo 吧 尝试开辟尽可能多的 协程 写一个 demo &#xff0c;循环开 1 << 31 …

Mac 安装 homebrew

文章目录1. 简介2. 安装2.1 官方安装2.2 安装 ARM 版 Homebrew2.3 安装 X86 版 Homebrew2.4 多版本共存3. 设置镜像3.1 初次安装brew后配置中科大 zsh3.2 换源配置中科大 zsh3.3 换源清华大学 zsh4. 问题1. 简介 omebrew是一款包管理工具&#xff0c;目前支持macOS和linux系统…

「TCG 规范解读」第10章 TPM工作组 保护你的数字环境

可信计算组织&#xff08;Ttrusted Computing Group,TCG&#xff09;是一个非盈利的工业标准组织&#xff0c;它的宗旨是加强在相异计算机平台上的计算环境的安全性。TCG于2003年春成立&#xff0c;并采纳了由可信计算平台联盟&#xff08;the Trusted Computing Platform Alli…

【春秋云境】CVE-2022-28512

靶标介绍&#xff1a; ​ Fantastic Blog (CMS)是一个绝对出色的博客/文章网络内容管理系统。它使您可以轻松地管理您的网站或博客&#xff0c;它为您提供了广泛的功能来定制您的博客以满足您的需求。它具有强大的功能&#xff0c;您无需接触任何代码即可启动并运行您的博客。…

IDEA工具系列之连接Linux

我们在开发的时候&#xff0c;用IDEA开发程序&#xff0c;用XSHELL来管理服务器&#xff0c;这两个工具切换比较麻烦。有没有用IDEA来连接Linux。当然有&#xff0c;下面有实践步骤&#xff1a; 首先&#xff1a;连接Linux 打开IDEA->Tools->Start SSH Session 其中1&…

REDIS09_LBS出现背景、GEO算法介绍、算法步骤、剖析、邻近网格位置推算

文章目录①. LBS出现的背景②. 重新认识经纬度③. 感性认识GeoHash④. Geohash算法介绍⑤. Geohash算法步骤⑥. 更深入剖析GeoHash⑦. 邻近网格位置推算①. LBS出现的背景 ①. 移动互联网时代LBS应用越来越多,所在位置附近三公里的药店、交友软件中附近的小姐姐、外卖软件中附近…

stm32f407探索者开发板(二十)——独立看门狗实验

文章目录一、独立看门狗概述1.1 独立看门狗二、常用寄存器和库函数配置2.1 独立看门狗框图2.2 键值寄存器IWDG_KR2.3 预分频寄存器IWDG_PR2.4 重装载寄存器IWDG_RLR2.5 状态寄存器IWDG_SR2.6 IWDG独立看门狗操作库函数三、手写独立看门狗实验3.1 操作步骤3.2 iwdg.c3.3 iwdg.h3…