共计 4134 个字符,预计需要花费 11 分钟才能阅读完成。
简介
本篇次要介绍如何应用 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 装置和开发环境配置 https://gitee.com/openharmony…
源码门路 https://gitee.com/openharmony…
NAPI 课程学习门路 https://gitee.com/openharmony…