HarmonyOS:使用DevEco Studio模板构建NDK工程

一、概述

HarmonyOS NDK默认使用CMake作为构建系统,随包提供了符合HarmonyOS工具链的基础配置文件ohos.toolchain.cmake,用于预定义CMake变量来简化开发者配置。
常用的NDK工程构建方式有:

  • 从源码构建 源码构建也有不同方式:
    • 可以使用DevEco Studio提供的C++应用模板,用DevEco Studio来编译构建
    • 也可以使用命令行CMake来编译构建
  • 使用预构建库构建

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++代码,编译过程如下图所示。

      核心编译过程如下:
  1. 根据CMake配置脚本以及build-profile.json5中配置的externalNativeOptions构建参数,与缓存中的配置比对后,生成CMak 命令并执行CMake。
  2. 执行Ninja,按照makefile执行编译和链接,将生成的.so以及运行时依赖的.so同步到输出目录,完成构建过程。
    通过DevEco Studio提供的应用模板,可以快速生成CMake构建脚本模板,并在build-profile.json5中指定相关编译构建参数。

二、CMakeLists.txt

通过DevEco Studio模板工程创建的NDK工程中,包含默认生成的CMakeLists.txt脚本,如下所示:

scss 复制代码
# the minimum version of CMake.
cmake_minimum_required(VERSION 3.5.0)
project(LearNDK)
# 定义一个变量,并赋值为当前模块cpp目录
set(NATIVERENDER_ROOT_PATH ${CMAKE_CURRENT_SOURCE_DIR})

if(DEFINED PACKAGE_FIND_FILE)
    include(${PACKAGE_FIND_FILE})
endif()
# 添加头文件.h目录,包括cpp,cpp/include,告诉cmake去这里找到代码引入的头文件
include_directories(${NATIVERENDER_ROOT_PATH}
                    ${NATIVERENDER_ROOT_PATH}/include)
# 声明一个产物libentry.so,SHARED表示产物为动态库,hello.cpp为产物的源代码
add_library(entry SHARED napi_init.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配置编译架构等。

json 复制代码
"apiType": "stageMode",
"buildOption": {
  "arkOptions": {
   },
  "externalNativeOptions": {
    "path": "./src/main/cpp/CMakeLists.txt",
    "arguments": "",
    "cppFlags": "",
    "abiFilters": [
       "arm64-v8a",
       "x86_64"
    ],
  }
}

externalNativeOptions具体参数说明如下表所示。

配置项 类型 说明
path string CMake构建脚本地址,即CMakeLists.txt文件地址。
abiFilters array 本机的ABI编译环境,包括: - arm64-v8a - x86_64 如不配置该参数,编译时默认编译出arm64-v8a架构相关so。
arguments string CMake编译参数。
cppFlags string C++编译器参数。
相关推荐
小雨青年10 小时前
【HarmonyOS 7 平行视界深度实战】06 页面路由、返回栈与多层跳转怎么处理
华为·harmonyos
2501_9197490315 小时前
华为鸿蒙免费刷题软件—小羊免费刷题
华为·harmonyos·鸿蒙
游戏智眼15 小时前
HarmonyOS 7 适配升级:NIM SDK 释放端侧 AI 与网络能力
人工智能·harmonyos
程序猿追17 小时前
react-native-elements 三方库鸿蒙版本适配与使用(MatePad Edge 双模式真机验证)
华为·harmonyos
lqj_本人17 小时前
白泽上手:给小鸿 SE 写一个温控风扇工程
harmonyos
贾伟康18 小时前
【口算王|12】HarmonyOS ArkTS 启动页实战:处理 Splash 到训练首页的稳定切换
harmonyos·arkts·启动优化·uiability·windowstage
万物智能信息科技19 小时前
RK3568 的多路显示移植—【万物智能之开源鸿蒙OpenHarmony系统实战开发系列教程】
linux·开发语言·华为·开源·harmonyos
万物智能信息科技20 小时前
MIPI DSI屏幕输出—【万物智能之开源鸿蒙OpenHarmony系统实战开发系列教程】
嵌入式硬件·华为·开源·harmonyos·鸿蒙
贾伟康20 小时前
【口算王|13】HarmonyOS ArkTS 应用启动链路实战:从 EntryAbility 到首屏加载保持窗口与路由稳定
harmonyos·arkts·arkui·应用启动·entryability
万物智能信息科技1 天前
LVDS屏幕输出桌面—【万物智能之开源鸿蒙OpenHarmony系统实战开发系列教程】
人工智能·华为·开源·harmonyos·鸿蒙