鸿蒙HarmonOS实战开发: CMake脚本编写构建NDK工程

news2024/11/15 22:54:39

 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_STLc++_shared/c++_static

libc++的链接方式。默认为c++_shared。

c++_shared表示采用动态链接libc++_shared.so;c++_static表示采用静态链接libc++_static.a。

由于C++运行时中存在一些全局变量,因此同一应用中的全部Native库需要采用相同的链接方式。

OHOS_ARCHarmeabi-v7a/arm64-v8a/x86_64设置当前Native交叉编译的目标架构,当前支持的架构为armeabi-v7a/arm64-v8a/x86_64。
OHOS_PLATFORMOHOS选择平台。当前只支持HarmonyOS平台。

上述参数最终会控制Clang的交叉编译命令,产生合适的命令参数。

  • --target={arch}-linux-ohos参数,通知编译器生成相应架构下符合HarmonyOS ABI的二进制文件。

  • --sysroot={ndk_root}/sysroot参数,告知编译器HarmonyOS系统头文件的所在位置。

NDK通过CMake和Ninja编译应用的C/C++代码,编译过程如下图所示。

核心编译过程如下:

  1. 根据CMake配置脚本以及build-profile.json5中配置的externalNativeOptions构建参数,与缓存中的配置比对后,生成CMake命令并执行CMake。

  2. 执行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具体参数说明如下表所示。

配置项类型说明
pathstringCMake构建脚本地址,即CMakeLists.txt文件地址。
abiFiltersarray

本机的ABI编译环境,包括:

- arm64-v8a

- x86_64

如不配置该参数,编译时默认编译出arm64-v8a架构相关so。

argumentsstringCMake编译参数。
cppFlagsstringC++编译器参数。

最后

小编在之前的鸿蒙系统扫盲中,有很多朋友给我留言,不同的角度的问了一些问题,我明显感觉到一点,那就是许多人参与鸿蒙开发,但是又不知道从哪里下手,因为资料太多,太杂,教授的人也多,无从选择。有很多小伙伴不知道学习哪些鸿蒙开发技术?不知道需要重点掌握哪些鸿蒙应用开发知识点?而且学习时频繁踩坑,最终浪费大量时间。所以有一份实用的鸿蒙(HarmonyOS NEXT)资料用来跟着学习是非常有必要的。 

为了确保高效学习,建议规划清晰的学习路线,涵盖以下关键阶段:

希望这一份鸿蒙学习资料能够给大家带来帮助~


 鸿蒙(HarmonyOS NEXT)最新学习路线

该路线图包含基础技能、就业必备技能、多媒体技术、六大电商APP、进阶高级技能、实战就业级设备开发,不仅补充了华为官网未涉及的解决方案

路线图适合人群:

IT开发人员:想要拓展职业边界
零基础小白:鸿蒙爱好者,希望从0到1学习,增加一项技能。
技术提升/进阶跳槽:发展瓶颈期,提升职场竞争力,快速掌握鸿蒙技术

2.视频学习资料+学习PDF文档

(鸿蒙语法ArkTS、TypeScript、ArkUI教程……)

 纯血版鸿蒙全套学习资料(面试、文档、全套视频等)

                   

鸿蒙APP开发必备

​​

总结

参与鸿蒙开发,你要先认清适合你的方向,如果是想从事鸿蒙应用开发方向的话,可以参考本文的学习路径,简单来说就是:为了确保高效学习,建议规划清晰的学习路线

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2057552.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

机器学习在智能复合材料中的应用与实践

在人工智能与复合材料技术融合的背景下,复合材料的研究和应用正迅速发展,创新解决方 案层出不穷。从复合材料性能的精确预测到复杂材料结构的智能设计,从数据驱动的材料结构优 化到多尺度分析,人工智能技术正以其强大的数据处理能…

深度学习设计模式之策略模式

文章目录 前言一、介绍二、特点三、详细介绍1.核心组成2.代码示例3.优缺点优点缺点 4.使用场景 总结 前言 策略模式定义一系列算法,封装每个算法,并使它们可以互换。 一、介绍 策略模式(Strategy Pattern)是一种行为型设计模式&…

Linux:网络基础概念

网络发展 独立模式: 计算机之间相互独立; 网络互联: 多台计算机连接在一起, 完成数据共享; 局域网 LAN: 计算机数量更多了, 通过交换机和路由器连接在一起; 广域网 WAN: 将远隔千里的计算机都连在一起; 所谓 "局域网" 和 "广域网" 只是一个相对的概念. 比如…

【C++ 第十四章】红黑树

前言: 学习本章,需要先学习 AVL树的 旋转,因为 红黑树也需要旋转调整来平衡,下面讲解将不赘述 旋转的原理和操作 红黑树的旋转 和 AVL树的旋转 唯一不同的是:旋转的判断使用逻辑 AVL树的旋转 可以通过 平衡因子 判断…

关于c++ grpc 和 c# grpc 通信的问题 以及 grpc 认证问题

一、c 和 c# 通信 c# 端服务器 如果域名 输入的是 https ,则 c 端需要匹配使用,也就是c 端需要进行安全认证。如果是http 则c 端不需要认证(基于c#的grpc 未 通信成功) 参考如下网址可以写一个简单的 .net grpc服务器 &#xff08…

基于java的综合小区管理系统论文.doc

摘 要 如今社会上各行各业,都喜欢用自己行业的专属软件工作,互联网发展到这个时候,人们已经发现离不开了互联网。新技术的产生,往往能解决一些老技术的弊端问题。因为传统综合小区管理系统信息管理难度大,容错率低&am…

diamond安装与使用

1.前言 diamond是一款用于蛋白质和翻译后DNA搜索的序列比对工具,专为大规模序列数据的高性能分析设计。其主要特点包括: - 与BLAST相比,蛋白质和翻译后DNA的成对比对速度快100倍至10000倍。 2. 参考 https://github.com/bbuchfink/diamond …

微知-lspci如何查看pcie设备树状结构(-t)

对于查看pcie设备列表除了看是否存在 还需要看拓扑结构。如何看? lspci -t以减号为分割说明 第一列数字是域段 和 bus id。比如0000:00中0000是域 00是busid 第二列 01.2中01是device id。2是functionid 如果还有下游设备device还有一个指定busid的序号

[数据集][目标检测]夜间老鼠检测数据集VOC+YOLO格式316张1类别+视频文件1个

数据集格式:Pascal VOC格式YOLO格式(不包含分割路径的txt文件,仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数):316 标注数量(xml文件个数):316 标注数量(txt文件个数):316 标注类别…

I.MX6U交叉编译Qt项目-思维导图-学习笔记-基于正点原子阿尔法开发板

I.MX6U交叉编译Qt项目 安装交叉编译器 交叉编译器介绍 拷贝fsl-imx-x11-glibc-x86_64-meta-toolchain-qt5-cortexa7hf-neon-toolchain-4.1.15-2.1.0.sh至ubuntu 执行下面的指令修改脚本的权限,修改权限后可以看到此脚本颜色显示改变,说明修改成功 chmod…

理解Flink算子链

前言 对于flink初学者,如果我们观察WebUi中任务执行情况,可能会有一个疑惑,为什么节点和代码中的算子对不上? 从WebUi上看起来像是一个节点,会把转换处理的很多个任务都连接在一起,合并成了一个“大任务”。这又是怎么回事呢? 算子间的数据传输 我们先来考察一下算子…

Vue 旋转动画效果

目录 前言效果演示具体代码实现 前言 这里记录一个旋转动画&#xff0c;在鼠标经过的时候停止&#xff0c;鼠标离开继续旋转。 实现思路&#xff1a; 利用keyframes关键字定义一个旋转动画 效果演示 具体代码实现 <template><div class"container"><…

Cuda 基于Cmake创建Cuda项目

文章目录 一、简介1.1GPU的优势1.2 CUDA:通用并行计算平台和编程模型 二、Cuda项目三、实现效果参考资料 一、简介 1.1GPU的优势 图形处理单元(GPU)1在相同的价格和功率范围内提供比CPU高得多的指令吞吐量和内存带宽。许多应用程序利用这些更高的功能在GPU上比在CPU上运行得更…

ESP32-C3在MQTT访问时出现“transport_base: Poll timeout or error”问题的分析(7)

接前一篇文章:ESP32-C3在MQTT访问时出现“transport_base: Poll timeout or error”问题的分析(6) 上一回说到笔者分析base_poll_write函数中的select()返回的结果可能并不是超时而是负值,并且在base_poll_write函数中添加了打印,如下所示: 当时想着是更新固件并烧录之后…

学习笔记 韩顺平 零基础30天学会Java(2024.8.20)

P522 HashSet源码解读1 P523 HashSet源码解读2 开发技巧&#xff1a;在需要辅助变量或局部变量的时候再创建 P524 HashSet源码解读3 当单链表超过8个&#xff0c;但是还可以扩容的时候&#xff0c;将会把整条链表放到扩容后的最后应该位置上&#xff08;由老师讲解的16到32引起…

Windows SDK(八)模态对话框与非模态对话框

对话框的创建 对话框分为模态对话框和非模态对话框两种形式 模态对话框&#xff1a;自建消息循环&#xff0c;并且通过EnableWindow禁用了父窗口的键盘鼠标输入达到阻塞父窗口的功能。当有对话框&#xff0c;父窗口阻塞时&#xff0c;透过对话框是无法对父窗口进行操作的&…

【一起学Rust | 框架篇 | Tauri2.0框架】tauri中rust和前端的相互调用(rust调用前端)

文章目录 前言1. rust中调用前端2. 如何向前端发送事件3. 前端监听事件4. 执行js代码 前言 近期Tauri 2.0 rc版本发布&#xff0c;2.0版本迎来第一个稳定版本&#xff0c;同时官方文档也进行了更新。Tauri是一个使用Rust构建的框架&#xff0c;可以让你使用前端技术来构建桌面…

Redis7基础篇(六)

redis复制 目录 redis复制 前引 概念 能干嘛 怎么玩 基本操作 案例演示 前期配置 实操 常用三招 一主二仆 薪火相传 反客为主 复制原理和工作流程 复制的缺点 前引 redis复制这一篇有承上启下的作用 前面的 redis几乎是单机版 一台redis 概念 能干嘛 水平扩容…

收银系统源码-购物卡与会员卡的区别

很多门店都会推出一些只有指定商品才可以使用的购物卡或不同额度、不同折扣的消费卡&#xff0c;用来进行一些商品的促销或会员储值。如今时代实体卡容易丢失&#xff0c;很多人出门不愿意带钱包卡包。如果您有这样的功能需求&#xff0c;快来看看千呼新零售2.0购物卡功能吧&am…

[FSCTF 2023]寻找蛛丝马迹

点一下&#xff0c;看到只有页面背景颜色变化 查看一下页面源码吧&#xff0c;发现第一段flag 访问一下styles.css,看到顶部有一串乱码&#xff08;应该是flag一部分&#xff09;我们用火狐的修复文字编码工具 进行修复后显示 然后再访问script.js,依旧是乱码&#xff0c;同样…