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

news2024/11/26 23:31:08

简介

本篇主要介绍如何使用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.coloradmin.cn/o/364798.html

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

相关文章

【macos游戏】RimWorld人工智能说书人控制的科幻殖民地模拟器

原文来源于黑果魏叔官网,转载需注明出处。由人工智能说书人控制的科幻殖民地模拟器。RimWorld控制了一艘太空客轮坠毁的三名幸存者,该飞船在所探索的空间边缘建造了一个殖民地。这款游戏的灵感来源是萤火虫太空西部的精神、对矮人堡垒的深入研究以及史诗…

Python数值方法及数据可视化

随机数和蒙特卡洛模拟求解单一变量非线性方程求解线性系统方程函数的数学积分常微分方程的数值解 等势线绘图和曲线: 等势线 import numpy as np import matplotlib.pyplot as plt from mpl_toolkits.mplot3d import Axes3Dx_vals np.linspace(-5,5,20) y_vals …

我们接下来来讲解一下spring的spi机制

大家这俩可能会想到说spring的spi的应用场景,别着急我们慢慢来说,首先来说一个我们熟知的SpringBoot的自动装配是如何实现的?基本上,你一说是基于spring的SPI扩展机制,再把spring.factories文件和EnableAutoConfigurat…

Mysql——主从复制与读写分离

1.什么是主从复制 主从复制:是一种数据备份的方案。 一般来说,是使用两个或两个以上相同的数据库,将一个数据库当做主数据库,另一个数据库当做从数据库。在主数据库中进行相应操作时,从数据库记录下所有主数据库的操…

Hive学习——分桶抽样、侧视图与炸裂函数搭配、hive实现WordCount

目录 一、分桶抽样 1.抽取表中10%的数据 2.抽取表中30%的数据 3.取第一行 4.取第10行 5.数据块抽样 6.tablesample详解 二、UDTF——表生成函数 1.explode()——炸裂函数 2.posexpolde()——只能对array进行炸裂 3.inline()——炸裂结构体数组 三、UDTF与侧视图的搭…

【持续学习】清华最新持续学习综述

为了应对现实世界的动态变化,智能体需要在其生命周期中增量地获取、更新、积累和利用知识。这种能力被称为持续学习,为人工智能系统自适应发展提供了基础。本文来自于https://arxiv.org/abs/2302.00487在一般意义上,持续学习明显受到灾难性遗…

DO-254 和 DO-178B的区别(文末有易灵思核心板及配套下载线)

DO-178B介绍 DO-178B,机载系统和设备认证中的软件考虑,在电子硬件被要求符合 DO-254 之前多年就已发布和采纳。DO-178B 的先行一步对电子硬件开发带来两个特别的后果。首先,使得硬件制造商有了一种倾向,为了避免 DO-178B 对软件开…

OSI模型和网络协议简介

文章目录一、OSI七层模型1.1什么是OSI七层模型?1.2这个网络模型究竟是干什么呢?二、TCP/IP协议三、常见协议四、物联网通信协议以及MQTT4.1 物联网七大通信协议4.2 MQTT特性一、OSI七层模型 1.1什么是OSI七层模型? 我们需要了解互联网的本质…

unity实现2D小游戏FlappyBird-2D

unity实现2D小游戏FlappyBird-2D 一、游戏介绍(unity工程文件资源包链接) https://download.csdn.net/download/weixin_48388330/87483337 实现预加载动画,UI界面展示,空格键或鼠标左键可控制Bird的高度,从而通过障…

关于医疗场所电源配置及变配电系统设计与应用分析

摘要:针对不同医疗场所,结合医疗负荷分级,从维持供电时间和恢复供电时间的角度分析相应的电源配置和配电措施,以构建适合医疗场所的可靠供配电系统。 关键词:医疗场所;电源配置;安全电源&#…

vue+echarts:圆形柱状图设置角度和最大值

第020个点击查看专栏目录本示例是显示圆形的柱状图,angleAxis设置一个max, angleAxis上startAngle:90 , 将0点设置为最顶点。 文章目录示例效果示例源代码(共100行)相关资料参考专栏介绍示例效果 示例源代码…

【免费教程】地下水模拟及环评之水文地质基础与建模流程、数据要求专题

地下水地下水(ground water),是指赋存于地面以下岩石空隙中的水,狭义上是指地下水面以下饱和含水层中的水。在国家标准《水文地质术语》(GB/T 14157-93)中,地下水是指埋藏在地表以下各种形式的重…

HTTP协议知识体系核心重点梳理

HTTP协议知识体系核心重点梳理TCP/IP协议1.四层模型2.通信过程3.tcp三次握手和四次挥手4.tcp安全传输4. 一次HTTP通信流程HTTP协议HTTP/1.1CookieHttp报文格式内容编码分块传输编码HTTP状态码重定向状态码常用的通用首部cache-controlExpiresConnectionTransfer-Encoding常用的…

Sprng依赖注入(二):setter注入是如何工作的?

文章示例环境配置信息jdk版本:1.8开发工具:Intellij iDEA 2020.1springboot:2.3.9.RELEASE前言在Spring依赖注入(一):字段注入的方式是如何工作的?中主要分享了Spring bean依赖注入方式中的字段注入方式及其工作过程&a…

数据结构与算法之最长公共子序列动态规划

目录:一.题目及其示例二.动态规划的基本思想三.思路动态规划五部曲1.确定dp数组(dp table)以及下标的含义2.确定递推公式3.dp数组如何初始化4.确定遍历顺序5.举例推导dp数组一.题目及其示例给定两个字符串 text1 和 text2,返回这两…

Docker----------day5---安装redis集群

1.哈希取余分区 2亿条记录就是2亿个k,v,我们单机不行必须要分布式多机,假设有3台机器构成一个集群,用户每次读写操作都是根据公式: hash(key) % N个机器台数,计算出哈希值,用来决定数据映射到哪一个节点上。…

华为机试题:HJ81 字符串字符匹配(python)

文章目录(1)题目描述(2)Python3实现(3)知识点详解1、input():获取控制台(任意形式)的输入。输出均为字符串类型。1.1、input() 与 list(input()) 的区别、及其相互转换方…

VO,BO,PO,DO,DTO,AO的区别

DTO(Data Transfer Object)数据传输对象 这个传输通常指的前后端之间的传输 1.在前端的时候: 存在形式通常是js里面的对象(也可以简单理解成json),也就是通过ajax请求的那个数据体 2.在后端的时候&…

深入浅出C++ ——map类深度剖析

文章目录一、map类介绍二、map的使用三、multimap一、map类介绍 map是 C STL 中提供的容器,map是数学上的映射,其具有唯一性,即每个pair(key,value)只出现一次,而 multimap 则是可重复映射,两者的内部实现是一棵红黑树…

[Datawhale][CS224W]图机器学习(五)

这里写目录标题一、Deepwalk1.1 预备知识1.2 Deepwalk介绍1.3 Embedding1.4 word2Vec 词向量,词嵌入1.5 random Walk随机游走1.6 DeepWalk 核心代码Random WalkWord2vecDeepWalk应用1.7 DeepWalk优缺点二、Node2Vec2.1 图嵌入2.2 Node2Vec优化目标顶点序列采样策略2…