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系统头文件的所在位置。
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++编译器参数。 |
最后
小编在之前的鸿蒙系统扫盲中,有很多朋友给我留言,不同的角度的问了一些问题,我明显感觉到一点,那就是许多人参与鸿蒙开发,但是又不知道从哪里下手,因为资料太多,太杂,教授的人也多,无从选择。有很多小伙伴不知道学习哪些鸿蒙开发技术?不知道需要重点掌握哪些鸿蒙应用开发知识点?而且学习时频繁踩坑,最终浪费大量时间。所以有一份实用的鸿蒙(HarmonyOS NEXT)资料用来跟着学习是非常有必要的。
为了确保高效学习,建议规划清晰的学习路线,涵盖以下关键阶段:
希望这一份鸿蒙学习资料能够给大家带来帮助~
鸿蒙(HarmonyOS NEXT)最新学习路线
该路线图包含基础技能、就业必备技能、多媒体技术、六大电商APP、进阶高级技能、实战就业级设备开发,不仅补充了华为官网未涉及的解决方案
路线图适合人群:
IT开发人员:想要拓展职业边界
零基础小白:鸿蒙爱好者,希望从0到1学习,增加一项技能。
技术提升/进阶跳槽:发展瓶颈期,提升职场竞争力,快速掌握鸿蒙技术
2.视频学习资料+学习PDF文档
(鸿蒙语法ArkTS、TypeScript、ArkUI教程……)
纯血版鸿蒙全套学习资料(面试、文档、全套视频等)
鸿蒙APP开发必备
总结
参与鸿蒙开发,你要先认清适合你的方向,如果是想从事鸿蒙应用开发方向的话,可以参考本文的学习路径,简单来说就是:为了确保高效学习,建议规划清晰的学习路线