Android NDK开发详解之将 NDK 与其他构建系统配合使用

news2024/11/18 17:40:46

Android NDK开发详解之将 NDK 与其他构建系统配合使用

      • 概览
      • Autoconf
      • 非 Autoconf make 项目

注意:本页介绍的内容适用于 NDK r19 及更高版本。如果您使用的是旧版 NDK,请考虑进行升级。如果无法升级,请参阅独立工具链指南。

NDK 提供对 ndk-build 和 CMake 的官方支持。大多数用户应参考其中一个指南来构建应用代码。本文旨在介绍如何构建使用其他构建系统的现有代码。如果您要使用并非特定于 Android 的第三方依赖项,例如 OpenSSL 和 libbzip2,则可以参考本文。

如果构建系统维护者希望为构建系统增加原生 NDK 支持,应阅读构建系统维护者指南。

概览

只需完成定义目标环境所需的极少配置工作,即可使用 NDK 中的 Clang 编译器。
注意:在 NDK r19 之前,NDK 默认安装的工具链无法直接使用,需要改为使用 make_standalone_toolchain.py。这种情况不会再发生了。

为了确保针对正确的架构进行构建,请在调用 Clang 时使用 -target 传递适当的目标,或调用具有目标前缀的 Clang。例如,若要使用 API 级别 21 的 minSdkVersion 针对 64 位 ARM Android 进行编译,可使用以下两种方法,您可以选择其中最方便的一种:

$ $NDK/toolchains/llvm/prebuilt/$HOST_TAG/bin/clang++ \
    -target aarch64-linux-android21 foo.cpp

$ $NDK/toolchains/llvm/prebuilt/$HOST_TAG/bin/aarch64-linux-android21-clang++ \
    foo.cpp

在这两种情况下,请将 $NDK 替换为指向 NDK 的路径,将 $HOST_TAG 替换为指向根据下表所下载的 NDK 的路径:
在这里插入图片描述

这里的前缀或目标参数的格式是目标三元组,带有表示 minSdkVersion 的后缀。该后缀仅与 clang/clang++ 一起使用;binutils 工具(例如 ar 和 strip)不需要后缀,因为它们不受 minSdkVersion 影响。Android 支持的目标三元组如下:
在这里插入图片描述

许多项目的构建脚本都预计使用 GCC 风格的交叉编译器,其中每个编译器仅针对一种操作系统/架构组合,因此可能无法正常处理 -target。在这些情况下,您通常可以在编译器定义中包含 -target 参数(例如 CC="clang -target aarch64-linux-android21),或者使用三元组前缀的 Clang 二进制文件。

Autoconf

注意:通常无法在 Windows 上构建 Autoconf 项目。Windows 用户可以使用 Linux 虚拟机中的 Linux NDK 构建这些项目。适用于 Linux 的 Windows 子系统或许也能正常运行,但不受官方支持。目前已知 WSL1无法正常运行。

Autoconf 项目允许您指定与环境变量一起使用的工具链。例如,以下示例展示了如何在 Linux 上使用 API 级别 21 的 minSdkVersion 为 Android x86-64 构建 libpng。

# Check out the source.
git clone https://github.com/glennrp/libpng -b v1.6.37
cd libpng
# Only choose one of these, depending on your build machine...
export TOOLCHAIN=$NDK/toolchains/llvm/prebuilt/darwin-x86_64
export TOOLCHAIN=$NDK/toolchains/llvm/prebuilt/linux-x86_64
# Only choose one of these, depending on your device...
export TARGET=aarch64-linux-android
export TARGET=armv7a-linux-androideabi
export TARGET=i686-linux-android
export TARGET=x86_64-linux-android
# Set this to your minSdkVersion.
export API=21
# Configure and build.
export AR=$TOOLCHAIN/bin/llvm-ar
export CC=$TOOLCHAIN/bin/$TARGET$API-clang
export AS=$CC
export CXX=$TOOLCHAIN/bin/$TARGET$API-clang++
export LD=$TOOLCHAIN/bin/ld
export RANLIB=$TOOLCHAIN/bin/llvm-ranlib
export STRIP=$TOOLCHAIN/bin/llvm-strip
./configure --host $TARGET
make

此示例中选择的工具适用于 NDK r22 及更高版本。旧版 NDK 可能需要不同的工具。

非 Autoconf make 项目

注意:并非所有的 make 项目都支持交叉编译,且并非所有 make 项目都以相同的方式支持交叉编译。如果不进行修改,很可能无法构建项目。在这些情况下,请参阅构建系统维护者指南,了解有关将 build 移植到 Android 的说明。

一些 makefile 项目允许通过覆盖与在 autoconf 项目中覆盖的变量相同的变量进行交叉编译。以下示例展示了如何使用 API 级别 21 的 minSdkVersion 为 Android x86-64 构建 libbzip2。

# Check out the source.
git clone https://gitlab.com/bzip/bzip2.git
cd bzip2

# Only choose one of these, depending on your build machine...
export TOOLCHAIN=$NDK/toolchains/llvm/prebuilt/darwin-x86_64
export TOOLCHAIN=$NDK/toolchains/llvm/prebuilt/linux-x86_64

# Only choose one of these, depending on your device...
export TARGET=aarch64-linux-android
export TARGET=armv7a-linux-androideabi
export TARGET=i686-linux-android
export TARGET=x86_64-linux-android

# Set this to your minSdkVersion.
export API=21

# Build.
make \
    CC=$TOOLCHAIN/bin/$TARGET$API-clang \
    AR=$TOOLCHAIN/bin/llvm-ar \
    RANLIB=$TOOLCHAIN/bin/llvm-ranlib \
    bzip2

此示例中选择的工具适用于 NDK r22 及更高版本。旧版 NDK 可能需要不同的工具。

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

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

相关文章

在安装和配置DVWA渗透测试环境遇到的报错问题

安装环境 前面的安装我参考的这个博主:渗透测试漏洞平台DVWA环境安装搭建及初级SQL注入-CSDN博客 修改bug 1.首先十分感谢提供帮助的博主,搭建DVWA Web渗透测试靶场_dvwa 白屏-CSDN博客,解决了我大多数问题,报错如下&#xff1…

[毕设记录]@开题调研:CAAI资源

发现这里面有些东西还是不错的 https://www.caai.cn/index.php?s/home/article/index/id/53.html其中我主要需要用到大模型技术白皮书

Wi-Fi 6和5G 在应用场景上的区别

在工作领域,我们经常会面临两个选择,场景的解决方案是要用5G还是WiFi 6,其实判断并不困难,但我们仍然还是从理论概念上区分一下。 文章目录 什么是Wi-Fi 6什么是5GWi-Fi 6和5G 的区别区别一:覆盖范围区别二&#xff1…

【Azure】存储服务:Azure 的存储账户

文章目录 一、前提知识(建议了解)二、介绍 Azure 存储帐户三、使用 Microsoft Azure 门户创建存储帐户 一、前提知识(建议了解) 在每一个云厂商中,都有自身的云存储,也有根据不同功能进行区分的不同类型的…

IP代理被低估的作用,你知道吗?

IP说简单不简单,说复杂也不复杂,打个比方,IP就好比我们上网的一个门牌号,每家每户都会有一个门牌号,而且是唯一的地址。而代理IP(代理服务器)是一个位于中间的服务器,充当客户端和目…

springboot2.x通用异常捕获

文章目录 demo地址实现效果引入基础类准备1.通用枚举与错误状态枚举2.定义通用返回结果3.自定义业务异常 统一异常捕获测试 demo地址 demo工程地址 实现效果 当我们输入1时,正常的返回通用的响应结果当我们输入2时,抛出异常,被捕获然后返回…

解决由于找不到mfc140u.dll无法继续执行此代码问题的4个方法

mfc140u.dll是Microsoft Foundation Class(微软基础类库)中的一个动态链接库文件,它包含了许多用于实现Windows应用程序的基本功能。当我们在编写或运行基于MFC的程序时,如果系统中缺少这个文件,就会出现“找不到mfc14…

电脑端微信多开方式

方法一:电脑微信分身法 大家只需要先按住键盘上的enter键不放,然后用鼠标点击电脑上的微信即可,这里的微信分身个数不限,大家根据自己的实际需要进行点击即可,点击了几次就可以开出几个微信。 注意:前提是…

vscode debug skills

1) VSCode 调试 C/C 代码时,如何显示动态分配的指针数组。 创建一个动态分配的一维数组: int n 10; int *array (int *)malloc(n*sizeof(int)); memset(array, 1, n*sizeof(int)); 如果直接 Debug 时查看 array 指针,并不能看到数组所有的值。 查看…

uniapp 提供了一种运行于视图层的专属js,微信叫做wxs

小程序里有几个谜一样的存在,微信的WXS、支付宝的SJS、百度的Filter。 很多开发者都不明白为什么要造这种语言脚本的轮子出来,甚至很多开发者根本不知道它们的存在。 其实几大小程序平台创造它们,都是为了解决性能问题,但不得不…

Spring Boot中配置默认的HikariCP数据源

在了解HiKari之前,我们需要先了解关于数据访问的相关概念: 什么是JDBC JDBC(Java Database Connectivity)是Java编程语言用于与数据库进行交互的标准API。它提供了一组类和接口,用于执行数据库操作,如连接…

six是6,seven是7,“at sixes and sevens”可不是6、7点钟的意思!柯桥商务英语学校

暴露年纪的时候到了。 你有没有听过一首风靡全球的经典英文歌曲 ——Don’t Cry For Me Argentina 其中一段歌词是这样的: It wont be easy. Youll think it strange 我细诉心底话,大家都会惊讶 When I try to explain how I feel. That I still ne…

reese84

网址:https://beta.makeabooking.flyscoot.com/ 这个基本上会在航空网站上出现,国内的我也没见过,然后这个是我很早很早之前的老友分享的,然后昨天花时间去看了一下,之前经常听其他大佬说,但是我也出来没遇见过。 感觉…

14技术太卷我学APEX-RESTful服务全自动Autorest

Oracle REST 数据服务 (ORDS) 的 AutoREST 功能,该功能允许您将表和视图等自动公开为 RESTful Web 服务。这个太好可不用自己费劲巴拉的定义RESTful数据服务了。 1 先准备测试数据表 登录APEX现在开发平台 [https://apex.oracle.com/pls/apex/r/apex/workspace-si…

无线渗透|Wi-Fi渗透思路

对于WPA2 WPA3的一些渗透思路 0x00 进行渗透时需知晓的基础知识 1.WPA2:是WPA的升级版,是针对保护无线网络安全而设计的无线网络保护系统,引入了PSK(预共享密钥模式)秘钥,加强了WPA的不足之处,但是因为使…

day45

今日内容 标签的分类 1.单标签 imr br hr <img /> 2.双标签 a h p div <a> </a> 3.按照标签属性分类 &#xff08;1&#xff09;块儿标签 &#xff08;自己独占一行&#xff09; h1-h6 p div &#xff08;2&#xff09;行内(内联)标签 &a…

探求flutter全栈开发

显示一种网络图片 import package:flutter/material.dart; main(){runApp(MaterialApp(theme: ThemeData.dark(),home:Home(),));}class Home extends StatelessWidget{overrideWidget build(BuildContext context) {// TODO: implement buildreturn Scaffold(appBar:AppBar(t…

H5随机短视频滑动版带打赏源码V1.3

全新H5滑动屏幕观看&#xff0c;可封装APP软件或嵌入式观看&#xff0c;网站引流必备源码&#xff01; 数据来源抖音和快手官方短视频链接&#xff0c;无任何违规内容&#xff01; 可自行添加广告等等&#xff01; 手机端完美支持滑动屏幕观看&#xff08;向上或向右&#x…

隔离模块CC10-2405SF-E,嵌入式(MCU) STM32F207IGT7、SPC5742PK1AMLQ9R规格参数

一、CC10-2405SF-E 1.3至10W DC-DC转换器 CC系列DC-DC转换器具有高密度&#xff0c;输出电压为3.3V、5V、12V和15VDC&#xff0c;额定输出功率为3W至30W。CC模块采用通孔或SMT封装&#xff0c;带或不带屏蔽金属外壳。这些器件适用于-40C至85C的扩展温度范围应用&#xff0c;具…

一文浅析Instagram网红经济为什么远远超出其他社媒平台

根据数据显示&#xff0c;网红营销市场规模在短短五年时间内从2016年的17亿美元增长至2022年的164亿美元&#xff0c;累计增速超过了712%。未来&#xff0c;有专家预计该市场预计将进一步增长&#xff0c;将在2023年突破210亿美元。这种惊人的增长趋势源于社交媒体的快速发展以…