NDK工程构建概述
HarmonyOS NDK默认使用CMake作为构建系统,随包提供了符合HarmonyOS工具链的基础配置文件[ohos.toolchain.cmake],用于预定义CMake变量来简化开发者配置。
常用的NDK工程构建方式有:
-
从源码构建
源码构建也有不同方式:
- 可以使用DevEco Studio提供的C++应用模板,[用DevEco Studio来编译构建]
- 也可以[使用命令行CMake来编译构建]
-
[使用预构建库构建]
本章节将通过具体示例介绍如何在Native工程中使用NDK,以及如何编写CMake脚本来构建NDK工程。
ohos.toolchain.cmake简介
ohos.toolchain.cmake是HarmonyOS NDK提供给CMake的toolchain脚本,里面预定义了编译HarmonyOS应用需要设置的编译参数,如交叉编译设备的目标、C++运行时库的链接方式等;这些参数在调用CMake命令时,可以从命令行传入,来改变默认编译链接行为。此文件中的常用参数见下表。
参数 | 类型 | 说明 |
---|---|---|
OHOS_STL | c++_shared/c++_static | libc++的链接方式。默认为c++_shared。c++_shared表示采用动态链接libc++_shared.so;c++_static表示采用静态链接libc++_static.a。由于C++运行时中存在一些全局变量,因此同一应用中的全部Native库需要采用相同的链接方式。 |
OHOS_ARCH | armeabi-v7a/arm64-v8a/x86_64 | 设置当前Native交叉编译的目标架构,当前支持的架构为armeabi-v7a/arm64-v8a/x86_64。 |
OHOS_PLATFORM | OHOS | 选择平台。当前只支持HarmonyOS平台。 |
上述参数最终会控制Clang的交叉编译命令,产生合适的命令参数。
- –target={arch}-linux-ohos参数,通知编译器生成相应架构下符合HarmonyOS ABI的二进制文件。
- –sysroot={ndk_root}/sysroot参数,告知编译器HarmonyOS系统头文件的所在位置。
使用DevEco Studio模板构建NDK工程
NDK通过CMake和Ninja编译应用的C/C++代码,编译过程如下图所示。
核心编译过程如下:
- 根据CMake配置脚本以及build-profile.json5中配置的externalNativeOptions构建参数,与缓存中的配置比对后,生成CMake命令并执行CMake。
- 执行Ninja,按照makefile执行编译和链接,将生成的.so以及运行时依赖的.so同步到输出目录,完成构建过程。
通过DevEco Studio提供的应用模板,可以快速生成CMake构建脚本模板,并在build-profile.json5中指定相关编译构建参数。
CMakeLists.txt
通过DevEco Studio模板工程创建的NDK工程中,包含默认生成的CMakeLists.txt脚本,如下所示:
# the minimum version of CMake.cmake_minimum_required(VERSION 3.4.1)project(MyApplication)
# 定义一个变量,并赋值为当前模块cpp目录set(NATIVERENDER_ROOT_PATH ${CMAKE_CURRENT_SOURCE_DIR})
# 添加头文件.h目录,包括cpp,cpp/include,告诉cmake去这里找到代码引入的头文件include_directories(${NATIVERENDER_ROOT_PATH} ${NATIVERENDER_ROOT_PATH}/include)
# 声明一个产物libentry.so,SHARED表示产物为动态库,hello.cpp为产物的源代码add_library(entry SHARED hello.cpp)
# 声明产物entry链接时需要的三方库libace_napi.z.so# 这里直接写三方库的名称是因为它是在ndk中,已在链接寻址路径中,无需额外声明target_link_libraries(entry PUBLIC libace_napi.z.so)
默认的CMakeLists.txt脚本中添加了编译所需的源代码、头文件以及三方库,开发者可根据实际工程添加自定义编译参数、函数声明、简单的逻辑控制等。
externalNativeOptions
模块级build-profile.json5中externalNativeOptions参数是NDK工程C/C++文件编译配置的入口,可以通过path指定CMake脚本路径、arguments配置CMake参数、cppFlags配置C++编译器参数、abiFilters配置编译架构等。
"apiType": "stageMode","buildOption": { "arkOptions": { }, "externalNativeOptions": { "path": "./src/main/cpp/CMakeLists.txt", "arguments": "", "cppFlags": "", "abiFilters": [ "arm64-v8a", "armeabi-v7a", "x86_64" ], }}
externalNativeOptions具体参数说明如下表所示。
配置项 | 类型 | 说明 |
---|---|---|
path | string | CMake构建脚本地址,即CMakeLists.txt文件地址。 |
abiFilters | array | 本机的ABI编译环境,包括:- arm64-v8a- x86_64如不配置该参数,编译时默认编译出arm64-v8a架构相关so。 |
arguments | string | CMake编译参数。 |
cppFlags | string | C++编译器参数。 |
在最后
如果你觉得这篇内容对你还蛮有帮助,我想邀请你帮我三个小忙:
点赞,转发,有你们的 『点赞和评论』,才是我创造的动力。
关注小编,同时可以期待后续文章ing🚀,不定期分享原创知识。
更多鸿蒙最新技术知识点,请关注作者博客:https://gitee.com/li-shizhen-skin/zhihu/blob/master/README.md