交叉编译(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 等JNIAndroid 平台的所有系统头文件和 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…...
【WiFi帧结构】
文章目录 帧结构MAC头部管理帧 帧结构 Wi-Fi的帧分为三部分组成:MAC头部frame bodyFCS,其中MAC是固定格式的,frame body是可变长度。 MAC头部有frame control,duration,address1,address2,addre…...
多场景 OkHttpClient 管理器 - Android 网络通信解决方案
下面是一个完整的 Android 实现,展示如何创建和管理多个 OkHttpClient 实例,分别用于长连接、普通 HTTP 请求和文件下载场景。 <?xml version"1.0" encoding"utf-8"?> <LinearLayout xmlns:android"http://schemas…...
CMake基础:构建流程详解
目录 1.CMake构建过程的基本流程 2.CMake构建的具体步骤 2.1.创建构建目录 2.2.使用 CMake 生成构建文件 2.3.编译和构建 2.4.清理构建文件 2.5.重新配置和构建 3.跨平台构建示例 4.工具链与交叉编译 5.CMake构建后的项目结构解析 5.1.CMake构建后的目录结构 5.2.构…...
测试markdown--肇兴
day1: 1、去程:7:04 --11:32高铁 高铁右转上售票大厅2楼,穿过候车厅下一楼,上大巴车 ¥10/人 **2、到达:**12点多到达寨子,买门票,美团/抖音:¥78人 3、中饭&a…...
工程地质软件市场:发展现状、趋势与策略建议
一、引言 在工程建设领域,准确把握地质条件是确保项目顺利推进和安全运营的关键。工程地质软件作为处理、分析、模拟和展示工程地质数据的重要工具,正发挥着日益重要的作用。它凭借强大的数据处理能力、三维建模功能、空间分析工具和可视化展示手段&…...
稳定币的深度剖析与展望
一、引言 在当今数字化浪潮席卷全球的时代,加密货币作为一种新兴的金融现象,正以前所未有的速度改变着我们对传统货币和金融体系的认知。然而,加密货币市场的高度波动性却成为了其广泛应用和普及的一大障碍。在这样的背景下,稳定…...
云原生玩法三问:构建自定义开发环境
云原生玩法三问:构建自定义开发环境 引言 临时运维一个古董项目,无文档,无环境,无交接人,俗称三无。 运行设备的环境老,本地环境版本高,ssh不过去。正好最近对 腾讯出品的云原生 cnb 感兴趣&…...
云原生安全实战:API网关Kong的鉴权与限流详解
🔥「炎码工坊」技术弹药已装填! 点击关注 → 解锁工业级干货【工具实测|项目避坑|源码燃烧指南】 一、基础概念 1. API网关(API Gateway) API网关是微服务架构中的核心组件,负责统一管理所有API的流量入口。它像一座…...
关于uniapp展示PDF的解决方案
在 UniApp 的 H5 环境中使用 pdf-vue3 组件可以实现完整的 PDF 预览功能。以下是详细实现步骤和注意事项: 一、安装依赖 安装 pdf-vue3 和 PDF.js 核心库: npm install pdf-vue3 pdfjs-dist二、基本使用示例 <template><view class"con…...
Scrapy-Redis分布式爬虫架构的可扩展性与容错性增强:基于微服务与容器化的解决方案
在大数据时代,海量数据的采集与处理成为企业和研究机构获取信息的关键环节。Scrapy-Redis作为一种经典的分布式爬虫架构,在处理大规模数据抓取任务时展现出强大的能力。然而,随着业务规模的不断扩大和数据抓取需求的日益复杂,传统…...
