交叉编译(NDK)
文章目录
- 前言
- Android-NDK使用
- NDK目录结构
- 主流的Android NDK交叉编译
前言
交叉编译是指在一种计算机体系结构上编译和构建应用程序,但是生成的可执行文件和库是针对另一种不同的体系结构,比如ARM、MIPS、PowerPC、x86
等。
常见的交叉编译工具集:
- GNU 工具链:比如编译ARM64架构可以使用
gcc-aarch64-linux-gnu
工具,并可以使用gdb-multiarch
工具来进行调试,一般用qemu
来运行多架构的可执行文件然后使用gdb-multiarch
进来远程调试 - Clang/LLVM 工具链:Clang/LLVM 工具链支持许多不同的架构和操作系统
- Android NDK:专门为 Android 平台提供的交叉编译工具集。使用的编译工具链为
Clang/LLVM
- Microsoft Visual Studio 工具集:Microsoft Visual Studio 提供了一些用于 Windows 平台的交叉编译工具,包括 Visual C++ 工具集、Windows SDK 和 WDK。
- Intel C++ 编译器:Intel C++ 编译器支持多种架构和操作系统,包括 IA-32、Intel 64、ARM 等。
Android-NDK使用
为了进行交叉编译,需要为每种目标 CPU 架构配置相应的编译工具链和系统头文件,那么就需要下载NDK工具包里面包含了:
Clang/LLVM
交叉编译的工具集和GNU
工具集(现在一般都是用Clang/LLVM)库文件
libc、libm、libz、liblog 等JNI
Android 平台的所有系统头文件和 API,比如- OpenGL ES
- OpenSL ES
- Vulkan
- MediaCodec
- 调试工具比如
gdb\lldb
,NDK还提供了一个ndk-gdb
这个文件是一个python脚本文件通过封装adb+gdb
的方式来远程调试
NDK目录结构
$ wget https://dl.google.com/android/repository/android-ndk-r21e-darwin-x86_64.zip
#我是OSX系统则下载darwin版本$ ls
CHANGELOG.md/ ndk-gdb* shader-tools/
NOTICE ndk-stack* simpleperf/
NOTICE.toolchain ndk-which* source.properties
README.md/ package.xml sources/
build/ platforms/ sysroot/
meta/ prebuilt/ toolchains/
ndk-build* python-packages/ wrap.sh/
工具(外层是一个链接壳):
ndk-build
:bash
编译脚本,用于构建编译 C/C++ 命令,内部通过调用Clang/llvm
工具集、Cmake工具最终生成可用于 Android 应用程序的共享库。ndk-gdb
:python
脚本。用于调试 Android 应用程序的 GDB 调试器。ndk-stack
:用于解析崩溃日志的工具,可以将崩溃堆栈转换为可读的形式,以方便分析和修复错误。ndk-depends
:python
脚本。用于检查 C/C++ 代码的依赖关系。ndk-which
:bash
脚本。用于查找 NDK 工具链中的特定工具的路径。
目录:
-
toolchains
: 包含各种支持的 CPU 架构的编译器和工具链。 -
platforms
: 包含可用于构建本地库的 Android 平台版本。 -
sysroot
:包含头文件和库,这些库可以在特定平台版本上构建本地库时使用,里面包含vulkan
框架的共享库、头文件。 -
sources
:包含 Android 系统源代码,可以在构建本地库时使用。 -
build
:ndk-build工具的工作目录,内包含build-shader-tools.py
是一个用于将使用 OpenGL Shading Language (GLSL) 编写的着色器代码编译成可被 Android 应用程序使用的格式的 Python 脚本,该应用程序使用 Android NDK (Native Development Kit) 进行开发.build-shader-tools.py
是一个用于将使用 OpenGL Shading Language (GLSL) 编写的着色器代码编译成可被 Android 应用程序使用的格式的 Python 脚本,该应用程序使用 Android NDK (Native Development Kit) 进行开发。该脚本通常作为使用 OpenGL ES 进行图形渲染的 Android 应用程序构建过程的一部分使用。它以一个或多个 GLSL 文件作为输入,并生成可在应用程序中加载和使用的二进制文件
-
simpleperf
: simpleperf工具的 C++ 代码和相关的构建脚本,用于编译 simpleperf工具可执行文件simpleperf
是一个用于在 Android 系统上进行性能分析的工具。它是一个命令行工具,可帮助开发人员分析应用程序在运行时的 CPU 使用情况、函数调用频率、线程活动等方面的性能数据。可以通过ndk-build
脚本来编译simpleperf
工具的源代码,并生成simpleperf
可执行文件
-
shader-tools
包含了 GLSL 编译器等其他工具,用于生成、调试 GLSL 代码,并构建 OpenGL ES 应用程序
Toolchains目录:
$ ls
aarch64-linux-android-4.9/ renderscript/
arm-linux-androideabi-4.9/ x86-4.9/
llvm/ x86_64-4.9/
renderscript
:于构建 RenderScript 应用程序的工具集合(包含llvm-rs-cc
编译器)。RenderScript 是一种高性能计算框架,可以在 Android 应用程序中使用,用于处理图像、音频、视频等大数据集合aarch64/arm/x86/x86_64 -4.9
:用于构建各个架构的工具链目录,其中4.9
表示使用GCC 4.9
作为交叉编译工具集编译文件llvm
:里面存放着clang/llvm
工具集以及和上面GCC
一样各个架构的库文件
主流的Android NDK交叉编译
Clang/llvm
作为编译工具集,clang编译速度,以及代码优化比GCC强,并且clang本身就是一个可用于多架构编译前端编译器aarch64-linux-android
作为编译架构,目前的绝大部分Android真机都是armv8-a架构,小部分老手机使用armv7架构,x86\x64
在移动端市场上基本都是手机模拟器在使用
相关文章:
交叉编译(NDK)
文章目录前言Android-NDK使用NDK目录结构主流的Android NDK交叉编译前言 交叉编译是指在一种计算机体系结构上编译和构建应用程序,但是生成的可执行文件和库是针对另一种不同的体系结构,比如ARM、MIPS、PowerPC、x86 等。 常见的交叉编译工具集&#x…...
【数据库】MySQL 解读事务的意义及原则
目录 1.事务的概念 2.为什么要用事物 3.使用 4.事务的原则(ACID) 4.1原子性(Atomicity) 4.2一致性(Consistency) 4.3持久性(Durability) 4.4隔离性(Isolation…...

【Linux】冯诺依曼体系结构
冯诺依曼体系结构一、计算机结构体系来源二、冯诺依曼体系结构三、冯诺依曼体系结构中的数据流动一、计算机结构体系来源 研制电子计算机的想法产生于第二次世界大战期间,主要用来进行弹道计算,在"时间就是胜利"的战争年代,迫切需…...
【小白】git是什么?gitee和git和github的关系?
gitee问题一、git是什么?gitee和git和github的关系?问题二、能不能通俗易懂的说?问题一、git是什么?gitee和git和github的关系? Git是一种版本控制系统,用于管理文件的版本、记录文件的修改历史以及协同开…...

UDS 14229 -1 刷写34,36,37服务,标准加Trace讲解,没理由搞不明白
🍅 我是蚂蚁小兵,专注于车载诊断领域,尤其擅长于对CANoe工具的使用🍅 寻找组织 ,答疑解惑,摸鱼聊天,博客源码,点击加入👉【相亲相爱一家人】🍅 玩转CANoe&…...

【Android -- 软技能】聊聊程序员的软技能
什么是软技能? 所谓软技能,就是相对于「硬技能」而言的技能,对于程序员来说,「硬技能」就是计算机专业技术能力,软技能则是专业之外的所有技能,包括职业规划能力、处理人际关系能力、专业态度、做事的方式…...
【Java学习笔记】27.Java 抽象类
Java 抽象类 在面向对象的概念中,所有的对象都是通过类来描绘的,但是反过来,并不是所有的类都是用来描绘对象的,如果一个类中没有包含足够的信息来描绘一个具体的对象,这样的类就是抽象类。 抽象类除了不能实例化对象…...

Vite4 + Vue3 + vue-router4 动态路由
动态路由,基本上每一个项目都能接触到这个东西,通俗一点就是我们的菜单是根据后端接口返回的数据进行动态生成的。表面上是对菜单的一个展现处理,其实内部就是对router的一个数据处理。这样就可以根据角色权限或者一些业务上的需求࿰…...

MS(mbed l432KC)-->速通9个lab详细解析[5]
Exercise5 这次实验我们将正式接触到一个相对来说有点意思并且有点牌面的传感器了----->数码管。数码管是我们生活中非常常见的一种传感器,比如计时器,秒表,以及数字显示大屏幕,其实原理都跟数码管差不多。如果是没有单片机基础的同学,突然一下接触到相对来说比较常见…...

XXE漏洞复现
目录XML基础概念XML数据格式DTD基础定义DTD作用分类DTD实体实体的分类DTD元素XXE漏洞介绍实操如何探测xxe漏洞XML基础 概念 什么是XML 是一种可扩展标记语言 (Extensible Markup Language, XML) ,标准通用标记语言的子集,可以用来标记数据、定义数据类型…...

初识C++需要了解的一些东西(2)
😁关注博主:翻斗花园第一代码手牛爷爷 😃Gitee仓库:牛爷爷爱写代码 目录🌍内联函数🌕内联函数概念🌖内联函数特性🌓auto关键字(C11)🌞类型别名⭐️auto简介☀️auto的使…...

全国程序员薪酬大曝光!看完我酸了····
2023年,随着互联网产业的蓬勃发展,程序员作为一个自带“高薪多金”标签的热门群体,被越来越多的人所关注。在过去充满未知的一年中,他们的职场现状发生了一定的改变。那么,程序员岗位的整体薪资水平、婚恋现状、职业方…...

改进YOLO系列 | CVPR2023最新Backbone | FasterNet 远超 ShuffleNet、MobileNet、MobileViT 等模型
论文地址:https://export.arxiv.org/pdf/2303.03667v1.pdf 为了设计快速神经网络,许多工作都集中在减少浮点运算(FLOPs)的数量上。然而,作者观察到FLOPs的这种减少不一定会带来延迟的类似程度的减少。这主要源于每秒低浮点运算(FLOPS)效率低下。并且,如此低的FLOPS主要…...

Nginx常见用法
一、Niginx是什么? Nginx是一个高性能的HTTP和反向代理web服务器,同时也提供了IMAP/POP3/SMTP服务。Niginx是一款轻量级的web服务器/反向代理器,Nginx是高性能的HTTP和 反向代理的web服务器,处理高并发的能力十分强大,…...

MySQL存储引擎和日志管理
MySQL存储引擎和日志管理一、存储引擎的概念1、Myisam的特点2、Myisam表支持 3 种不同的存储格式3、innodb4、死锁5、查看系统支持的存储引擎6、查看表使用的存储引擎7、修改存储引擎8、通过 create table 创建表时指定存储引擎二、日志管理1、错误日志2、通用查询日志3、慢查询…...

Arduino 驱动DS1307时钟模块使用介绍
Arduino 驱动DS1307时钟模块使用介绍 🔖DS1307时钟模块 📍DS1307时钟模块资料 https://pan.baidu.com/s/1mtXruLAktZj7UDhFD54BNw 提取码:d9xh 📋模块简介:DS1307 I2C实时时钟芯片(RTC) 24C32 32K I2C EEPROM存储器 解决DS1307带备用电池不能读写的问题。 充满电后,…...
为什么 Python 没有 main 函数?
众所周知,Python中没有所谓的main函数,但是网上经常有文章提到“ Python的main函数”和“建议编写main函数”。 其实,可能他们是想模仿真正的main函数,但是许多人都被误导(或误解),然后编写了非…...

【无标题】使用Bibtex4word 整理毕业论文参考文献
Bibtex4Word使用一览需要安装和配置的软件texLiveBibtex4word需要安装和配置的软件 texLive 这个就不多说啦,大家自己找教程安装吧,因为我之前装过这一系列所以就不再来一遍了,但是有两条配置需要注意! 添加环境变量 key: BIB…...

19--网络API(java版)
什么是网络API在一个网站里面发起https请求是很常见的,但是,由于微信小程序是腾讯内部的产品,不能直接打开一个外部的链接,例如,您在微信小程序里面无法直接打开网站,但是,在做小程序开发的时候…...

ElasticSearch - 分片内部原理之动态更新索引、近实时搜索、持久化变更、段合并
文章目录01. ElasticSearch 倒排索引是什么?02. ElasticSearch 倒排索引为什么是不可变的?03. ElasticSearch 索引文档原理?04. ElasticSearch 如何动态更新索引?05. ElasticSearch 文档的新增、删除、更新?06. Elasti…...

C++实现分布式网络通信框架RPC(3)--rpc调用端
目录 一、前言 二、UserServiceRpc_Stub 三、 CallMethod方法的重写 头文件 实现 四、rpc调用端的调用 实现 五、 google::protobuf::RpcController *controller 头文件 实现 六、总结 一、前言 在前边的文章中,我们已经大致实现了rpc服务端的各项功能代…...

关于nvm与node.js
1 安装nvm 安装过程中手动修改 nvm的安装路径, 以及修改 通过nvm安装node后正在使用的node的存放目录【这句话可能难以理解,但接着往下看你就了然了】 2 修改nvm中settings.txt文件配置 nvm安装成功后,通常在该文件中会出现以下配置&…...
【服务器压力测试】本地PC电脑作为服务器运行时出现卡顿和资源紧张(Windows/Linux)
要让本地PC电脑作为服务器运行时出现卡顿和资源紧张的情况,可以通过以下几种方式模拟或触发: 1. 增加CPU负载 运行大量计算密集型任务,例如: 使用多线程循环执行复杂计算(如数学运算、加密解密等)。运行图…...
WEB3全栈开发——面试专业技能点P2智能合约开发(Solidity)
一、Solidity合约开发 下面是 Solidity 合约开发 的概念、代码示例及讲解,适合用作学习或写简历项目背景说明。 🧠 一、概念简介:Solidity 合约开发 Solidity 是一种专门为 以太坊(Ethereum)平台编写智能合约的高级编…...
大语言模型(LLM)中的KV缓存压缩与动态稀疏注意力机制设计
随着大语言模型(LLM)参数规模的增长,推理阶段的内存占用和计算复杂度成为核心挑战。传统注意力机制的计算复杂度随序列长度呈二次方增长,而KV缓存的内存消耗可能高达数十GB(例如Llama2-7B处理100K token时需50GB内存&a…...

如何在网页里填写 PDF 表格?
有时候,你可能希望用户能在你的网站上填写 PDF 表单。然而,这件事并不简单,因为 PDF 并不是一种原生的网页格式。虽然浏览器可以显示 PDF 文件,但原生并不支持编辑或填写它们。更糟的是,如果你想收集表单数据ÿ…...
使用Matplotlib创建炫酷的3D散点图:数据可视化的新维度
文章目录 基础实现代码代码解析进阶技巧1. 自定义点的大小和颜色2. 添加图例和样式美化3. 真实数据应用示例实用技巧与注意事项完整示例(带样式)应用场景在数据科学和可视化领域,三维图形能为我们提供更丰富的数据洞察。本文将手把手教你如何使用Python的Matplotlib库创建引…...
腾讯云V3签名
想要接入腾讯云的Api,必然先按其文档计算出所要求的签名。 之前也调用过腾讯云的接口,但总是卡在签名这一步,最后放弃选择SDK,这次终于自己代码实现。 可能腾讯云翻新了接口文档,现在阅读起来,清晰了很多&…...
PostgreSQL——环境搭建
一、Linux # 安装 PostgreSQL 15 仓库 sudo dnf install -y https://download.postgresql.org/pub/repos/yum/reporpms/EL-$(rpm -E %{rhel})-x86_64/pgdg-redhat-repo-latest.noarch.rpm# 安装之前先确认是否已经存在PostgreSQL rpm -qa | grep postgres# 如果存在࿰…...

MacOS下Homebrew国内镜像加速指南(2025最新国内镜像加速)
macos brew国内镜像加速方法 brew install 加速formula.jws.json下载慢加速 🍺 最新版brew安装慢到怀疑人生?别怕,教你轻松起飞! 最近Homebrew更新至最新版,每次执行 brew 命令时都会自动从官方地址 https://formulae.…...