简介

本篇主要介绍如何运用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接口运用,进步运用本身的履行效率。

作用图

完结作用如下图所示:

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

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

环境建立

咱们首先要完结运用开发环境的建立,本示例运行RK3568开发板上。

1、 建立运用开发环境

1.1、开始前请参阅运用开发快速上手链接,完结DevEco Studio的装置和开发环境装备:参阅链接

1.2、开发环境装备完结后,创立工程(模板挑选“Native C++”),挑选JS或许eTS语言开发。

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

2、运用调测

工程创立完结后,挑选运用真机进行调测。

2.1、将搭载OpenHarmony规范体系的开发板与电脑连接。

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

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

在编辑窗口右上角的东西栏,点击””按钮运行。

源码结构

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

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

文件阐明如下:

├── 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(add PUBLIC libace_napi.z.so)

ArkTS端完结

界面整体规划作用如下图所示:

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

界面完结部分代码,详细请检查源码(见参阅链接源码途径)。

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

ArkTS调用C++办法流程

在ArkTS调用C++流程的过程中,需要运用到Node_API、Cmake等东西来做中心转化,整个流程如下:

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

(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装置和开发环境装备

gitee.com/openharmony…

源码途径

gitee.com/openharmony…

NAPI课程学习途径

gitee.com/openharmony…

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