0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

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

OpenAtom OpenHarmony 来源:未知 2023-02-21 14:30 次阅读

开源项目 OpenHarmony是每个人的 OpenHarmony 79d93ac6-b1b0-11ed-bfe3-dac502259ad0.jpg

刘丽红

OpenHarmony知识体系工作组

简介

本篇主要介绍如何使用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接口使用,提高应用本身的执行效率。

效果图

实现效果如下图所示: 79f41ada-b1b0-11ed-bfe3-dac502259ad0.jpg   通过arkTs编写界面,根据界面展示点击输入框输入两个数,再点击计算按钮调用接口,将数据传入到C++端,C++端计算后再作为返回值到arkTs端。  

环境搭建

我们首先要完成应用开发环境的搭建,本示例运行RK3568开发板上。 1、搭建应用开发环境 1.1、开始前请参考应用开发快速上手链接,完成DevEco Studio的安装和开发环境配置:参考链接 1.2、开发环境配置完成后,创建工程(模板选择“Native C++”),选择JS或者eTS语言开发。 7a342df0-b1b0-11ed-bfe3-dac502259ad0.jpg   2、应用调测 工程创建完成后,选择使用真机进行调测。 2.1、将搭载OpenHarmony标准系统的开发板与电脑连接。 2.2、点击File> Project Structure... > Project>SigningConfigs界面勾选“Automatically generate signature”,等待自动签名完成即可,最后点击“OK”。如下图所示: 7a536274-b1b0-11ed-bfe3-dac502259ad0.png   在编辑窗口右上角的工具栏,点击"7aa135f8-b1b0-11ed-bfe3-dac502259ad0.jpg"按钮运行。

源码结构

代码结构分析,整个工程的代码结构如下: 7ab612ca-b1b0-11ed-bfe3-dac502259ad0.png   文件说明如下:
├── 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_START
static 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(addPUBLIClibace_napi.z.so)

arkTs端实现

界面整体规划效果如下图所示: 7acf10b8-b1b0-11ed-bfe3-dac502259ad0.jpg   界面实现部分代码,具体请查看源码(见参考链接源码路径)。
@Entry
@Component
struct Index {
  ...
  build() {
    Row() {
      Column() {
      }
      .width('100%')
    }
    .height('100%')
  }
}

arkTs调用C++方法流程

在arkTs调用C++流程的过程中,需要使用到Node_API、Cmake等工具来做中间转换,整个流程如下: 7adfbe72-b1b0-11ed-bfe3-dac502259ad0.jpg   (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包 点击"7aa135f8-b1b0-11ed-bfe3-dac502259ad0.jpg"按钮安装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


原文标题:如何使用DevEco Studio创建Native C++应用

文章出处:【微信公众号:OpenAtom OpenHarmony】欢迎添加关注!文章转载请注明出处。


声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 鸿蒙
    +关注

    关注

    57

    文章

    2464

    浏览量

    43582
  • OpenHarmony
    +关注

    关注

    26

    文章

    3795

    浏览量

    17657

原文标题:如何使用DevEco Studio创建Native C++应用

文章出处:【微信号:gh_e4f28cfa3159,微信公众号:OpenAtom OpenHarmony】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    相关推荐

    最新 HUAWEI DevEco Studio 调试技巧

    # 最新 HUAWEI DevEco Studio 调试技巧 ## 前言 ![image-20240531235823670](https
    发表于 03-30 06:55

    鸿蒙北向开发OpenHarmony5.0 DevEco Studio开发工具安装与配置

    本文介绍OpenHarmony5.0 DevEco Studio开发工具安装与配置,鸿蒙北向开发入门必备!由触觉智能Purple Pi OH鸿蒙开发板演示。搭载了瑞芯微RK3566四核处理器,支持开源鸿蒙OpenHarmony3.2至5.0系统,适合鸿蒙开发入门学习。
    的头像 发表于 03-28 18:05 318次阅读
    鸿蒙北向开发OpenHarmony5.0 <b class='flag-5'>DevEco</b> <b class='flag-5'>Studio</b>开发工具安装与配置

    【贝启科技BQ3568HM开源鸿蒙开发板深度试用报告】使用Deveco Studio进行开发

    (huawei.com) 下载: 安装好,打开Deveco Studio,安装OpenHarmony SDK版本 Api 11: 二、创建测试工程 打开Deveco
    发表于 03-16 11:28

    DevEco Studio 联合小艺接入 DeepSeek,步骤更简单开发鸿蒙更专业

    完成后,打开 DevEco Studio创建一个新的鸿蒙应用项目,选择适合的模板(如 Empty Ability)。 2、下载并安装 CodeGenie 工具 如果你安装的是官网最新的 De
    发表于 03-13 15:11

    HarmonyOS NEXT开发实战:DevEco Studio中DeepSeek的使用

    。安装完成后,打开DevEco Studio创建一个新的鸿蒙应用项目,选择适合的模板(如Empty Ability)。 第二步:安装CodeGPT插件 在DevEco
    发表于 03-07 14:56

    创建了用于OpenVINO™推理的自定义C++和Python代码,从C++代码中获得的结果与Python代码不同是为什么?

    创建了用于OpenVINO™推理的自定义 C++ 和 Python* 代码。 在两个推理过程中使用相同的图像和模型。 从 C++ 代码中获得的结果与 Python* 代码不同。
    发表于 03-06 06:22

    如何在DevEco Studio中利用CodeGPT接入DeepSeek

    近期DeepSeek火爆全球,那一样很火的开发鸿蒙原生应用的DevEco Studio如果把它接入,会发生什么“化学反应”呢?下面我们将详细分享如何在DevEco Studio中利用C
    的头像 发表于 02-19 13:52 671次阅读
    如何在<b class='flag-5'>DevEco</b> <b class='flag-5'>Studio</b>中利用CodeGPT接入DeepSeek

    鸿蒙北向开发OpenHarmony4.1 DevEco Studio开发工具安装与配置

    OpenHarmony4.1 DevEco Studio开发工具安装与配置,鸿蒙北向开发入门必备!
    的头像 发表于 02-07 17:35 485次阅读
    鸿蒙北向开发OpenHarmony4.1 <b class='flag-5'>DevEco</b> <b class='flag-5'>Studio</b>开发工具安装与配置

    Spire.XLS for C++组件说明

    开发人员可以快速地在 C++ 平台上完成对 Excel 的各种编程操作,如根据模板创建新的 Excel 文档,编辑现有 Excel 文档,以及对 Excel 文档进行转换。 Spire.XLS
    的头像 发表于 01-14 09:40 420次阅读
    Spire.XLS for <b class='flag-5'>C++</b>组件说明

    戈帅的《HarmonyOS从入门到精通40例》DevEco Studio升级说明

    《HarmonyOS从入门到精通40例》DevEco Studio升级说明如附件*附件:《HarmonyOS从入门到精通40例》DevEco Studio升级说明.docx
    发表于 12-03 15:45

    DevEco Studio应用与服务体检工具介绍

    应用检测工具是开发者快速提升鸿蒙应用产品质量不可或缺的。因此,我们要向您推荐DevEco Studio应用与服务体检工具(AppAnalyzer)。当前已支持包括各种类型测试以及最佳实践测试,对于
    的头像 发表于 11-05 11:39 815次阅读
    <b class='flag-5'>DevEco</b> <b class='flag-5'>Studio</b>应用与服务体检工具介绍

    DevEco Studio Code Linter的使用指南

    在当今对代码质量和规范性要求日益严格的环境中,开发者亟需强大的代码检查工具来应对挑战。DevEco Studio Code Linter正是这样一款工具,它通过提升代码质量、统一代码风格,并有效检测安全漏洞和潜在bug,为开发者提供了显著的优势,成为现代软件开发中不可或缺
    的头像 发表于 11-05 09:52 678次阅读

    c++编译后链接失败的原因?如何解决?

    首先使用rt-thread studio 2.2.8创建rt-thread nano项目,nano版本为3.1.5 此时为c项目,点击编译是正常的。 然后选择菜单新建->转换为c
    发表于 07-25 08:13

    鸿蒙开发:创建PageAbility

    通过DevEco Studio开发平台创建PageAbility时,DevEco Studio会在app.js/app.ets中默认生成on
    的头像 发表于 06-18 09:36 364次阅读
    鸿蒙开发:<b class='flag-5'>创建</b>PageAbility

    HarmonyOS开发案例:【Stage模型下Ability的创建和使用】

    基于Stage模型,对Ability的创建和使用进行讲解。首先在课程中我们将带领大家使用DevEco Studio创建一个Stage模型Ability,并使用UIAbilityCont
    的头像 发表于 05-08 14:41 1063次阅读
    HarmonyOS开发案例:【Stage模型下Ability的<b class='flag-5'>创建</b>和使用】