简介
本篇主要介绍如何运用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_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端完结
界面整体规划作用如下图所示:
界面完结部分代码,详细请检查源码(见参阅链接源码途径)。
@Entry
@Component
struct 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装置和开发环境装备
gitee.com/openharmony…
源码途径
gitee.com/openharmony…
NAPI课程学习途径
gitee.com/openharmony…