Android NDK开发详解之Application.mk探秘

news2024/11/19 20:30:34

Android NDK开发详解之Application.mk探秘

      • 概览
      • 变量
        • APP_ASFLAGS
        • APP_ASMFLAGS
        • APP_BUILD_SCRIPT
        • APP_CFLAGS
        • APP_CLANG_TIDY
        • APP_CLANG_TIDY_FLAGS
        • APP_CONLYFLAGS
        • APP_CPPFLAGS
        • APP_CXXFLAGS
        • APP_DEBUG
        • APP_LDFLAGS
        • APP_MANIFEST
        • APP_MODULES
        • APP_OPTIM
        • APP_PLATFORM
        • APP_PROJECT_PATH
        • APP_STL
        • APP_STRIP_MODE
        • APP_THIN_ARCHIVE
        • APP_WRAP_SH

本文档介绍 ndk-build 所使用的 Application.mk 构建文件。

我们建议先阅读概念页面,然后再阅读本页面。

概览

Application.mk 指定 ndk-build 的项目级设置。默认情况下,它位于应用项目目录中的 jni/Application.mk 下。
注意:其中许多参数也具有模块等效项。例如,APP_CFLAGS 对应于 LOCAL_CFLAGS。无论何种情况下,特定于模块的选项都将优先于应用级选项。对于标记,两者都使用,但特定于模块的标记将后出现在命令行中,因此它们可能会替换项目级设置。

变量

APP_ABI

默认情况下,NDK 构建系统会为所有非弃用 ABI 生成代码。您可以使用 APP_ABI 设置为特定 ABI 生成代码。表 1 显示了不同指令集的 APP_ABI 设置。

在这里插入图片描述

您也可以指定多个值,方法是将它们放在同一行上,中间用空格分隔。例如:


APP_ABI := armeabi-v7a arm64-v8a x86

注意:Gradle 的 externalNativeBuild 会忽略 APP_ABI。请在 splits 块内部使用 abiFilters 块或(如果使用的是“多个 APK”)abi 块。

如需查看所有受支持 ABI 的列表以及详细了解其用法和限制,请参阅 Android ABI。

APP_ASFLAGS

要传递给项目中每个汇编源文件(.s 和 .S 文件)的编译器的标记。
注意:ASFLAGS 与 ASMFLAGS 不同。后者专用于 YASM 源文件(请参阅关于 APP_ASMFLAGS 的部分)。

APP_ASMFLAGS

对于所有 YASM 源文件(.asm,仅限 x86/x86_64),要传递给 YASM 的标记。

APP_BUILD_SCRIPT

默认情况下,ndk-build 假定 Android.mk 文件位于项目根目录的相对路径 jni/Android.mk 中。

如需从其他位置加载 Android.mk 文件,请将 APP_BUILD_SCRIPT 设置为 Android.mk 文件的绝对路径。
注意:Gradle 的 externalNativeBuild 将根据 externalNativeBuild.ndkBuild.path 变量自动配置此路径。

APP_CFLAGS

要为项目中的所有 C/C++ 编译传递的标记。
注意:Include 路径应使用 LOCAL_C_INCLUDES 而不是显式 -I 标记。

另请参阅:APP_CONLYFLAGS、APP_CPPFLAGS。

APP_CLANG_TIDY

若要为项目中的所有模块启用 clang-tidy,请将此标记设置为“True”。默认处于停用状态。

APP_CLANG_TIDY_FLAGS

要为项目中的所有 clang-tidy 执行传递的标记。

APP_CONLYFLAGS

要为项目中的所有 C 编译传递的标记。这些标记不会用于 C++ 代码。

另请参阅:APP_CFLAGS、APP_CPPFLAGS。

APP_CPPFLAGS

要为项目中的所有 C++ 编译传递的标记。这些标记不会用于 C 代码。

另请参阅:APP_CFLAGS、APP_CONLYFLAGS。

APP_CXXFLAGS

注意:APP_CPPFLAGS 应优先于 APP_CXXFLAGS。

与 APP_CPPFLAGS 相同,但在编译命令中将出现在 APP_CPPFLAGS 之后。例如:


APP_CPPFLAGS := -DFOO
APP_CXXFLAGS := -DBAR

以上配置将导致编译命令类似于 clang++ -DFOO -DBAR,而不是 clang++ -DBAR -DFOO。

APP_DEBUG

若要构建可调试的应用,请将此标记设置为“True”。

APP_LDFLAGS

关联可执行文件和共享库时要传递的标记。
注意:这些标记对静态库没有影响。不会关联静态库。

APP_MANIFEST

AndroidManifest.xml 文件的绝对路径。

默认情况下将使用 $(APP_PROJECT_PATH)/AndroidManifest.xml)(如果存在)。
注意:使用 externalNativeBuild 时,Gradle 不会设置此值。

APP_MODULES

要构建的模块的显式列表。此列表的元素是模块在 Android.mk 文件的 LOCAL_MODULE 中显示的名称。

默认情况下,ndk-build 将构建所有共享库、可执行文件及其依赖项。仅当项目使用静态库、项目仅包含静态库或者在 APP_MODULES 中指定了静态库时,才会构建静态库。
注意:将不会构建导入的模块(在使用 $(call import-module) 导入的构建脚本中定义的模块),除非要在 APP_MODULES 中构建或列出的模块依赖导入的模块。

APP_OPTIM

将此可选变量定义为 release 或 debug。默认情况下,将构建发布二进制文件。

发布模式会启用优化,并可能生成无法与调试程序一起使用的二进制文件。调试模式会停用优化,以便可以使用调试程序。

请注意,您可以调试发布二进制文件或调试二进制文件。但是,发布二进制文件在调试期间提供的信息较少。例如,变量可能会被优化掉,导致无法检查代码。此外,代码重新排序会使单步调试代码变得更加困难;堆栈轨迹更可能不可靠。

在应用清单的 标记中声明 android:debuggable 将导致此变量默认为 debug,而不是 release。通过将 APP_OPTIM 设置为 release 可替换此默认值。
注意:使用 externalNativeBuild 进行构建时,Android Studio 将根据您的构建风格适当地设置此标记。

APP_PLATFORM

APP_PLATFORM 会声明构建此应用所面向的 Android API 级别,并对应于应用的 minSdkVersion。

如果未指定,ndk-build 将以 NDK 支持的最低 API 级别为目标。最新 NDK 支持的最低 API 级别总是足够低,可以支持几乎所有有效设备。
警告:将 APP_PLATFORM 设置为高于应用的 minSdkVersion 可能会生成一个无法在旧设备上运行的应用。在大多数情况下,库将无法加载,因为它们引用了在旧设备上不可用的符号。

例如,值 android-16 指定库使用在 Android 4.1(API 级别 16)以前的版本中不可用的 API,并且无法在运行较低平台版本的设备上使用。如需查看平台名称和相应 Android 系统映像的完整列表,请参阅 Android NDK 原生 API。

使用 Gradle 和 externalNativeBuild 时,不应直接设置此参数。而应在模块级别 build.gradle 文件的 defaultConfig 或 productFlavors 块中设置 minSdkVersion 属性。这样就能确保只有在运行足够高 Android 版本的设备上安装的应用才能使用您的库。

请注意,NDK 不包含 Android 每个 API 级别的库,省略了不包含新的原生 API 的版本以节省 NDK 中的空间。ndk-build 按以下优先级降序使用 API:

    匹配 APP_PLATFORM 的平台版本。
    低于 APP_PLATFORM 的下一个可用 API 级别。例如,APP_PLATFORM 为 android-20 时,将使用 android-19,因为 android-20 中没有新的原生 API。
    NDK 支持的最低 API 级别。
APP_PROJECT_PATH

项目根目录的绝对路径。
APP_SHORT_COMMANDS

LOCAL_SHORT_COMMANDS 的项目级等效项。如需了解详情,请参阅 Android.mk 中有关 LOCAL_SHORT_COMMANDS 的文档。

APP_STL

用于此应用的 C++ 标准库。

默认情况下使用 system STL。其他选项包括 c++_shared、c++_static 和 none。请参阅 NDK C++ 运行时和功能。

APP_STRIP_MODE

要为此应用中的模块传递给 strip 的参数。默认为 --strip-unneeded。若要避免剥离模块中的所有二进制文件,请将其设置为 none。如需了解其他剥离模式,请参阅剥离文档。

APP_THIN_ARCHIVE

要为项目中的所有静态库使用瘦归档,请将此变量设置为“True”。如需了解详情,请参阅 Android.mk 中有关 LOCAL_THIN_ARCHIVE 的文档。

APP_WRAP_SH

要包含在此应用中的 wrap.sh 文件的路径。

每个 ABI 都存在此变量的变体,ABI 通用变体也是如此:


    APP_WRAP_SH
    APP_WRAP_SH_armeabi-v7a
    APP_WRAP_SH_arm64-v8a
    APP_WRAP_SH_x86
    APP_WRAP_SH_x86_64

注意:APP_WRAP_SH_ 可能无法与 APP_WRAP_SH 结合使用。如果有任何 ABI 使用特定于 ABI 的 wrap.sh,所有 ABI 都必须使用该 wrap.sh。

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

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

相关文章

怎么实现在外远程访问连接家里内网的威联通NAS?

文章目录 前言1. 威联通安装cpolar内网穿透2. 内网穿透2.1 创建隧道2.2 测试公网远程访问 3. 配置固定二级子域名3.1 保留二级子域名3.2 配置二级子域名 4. 使用固定二级子域名远程访问 前言 购入威联通NAS后,很多用户对于如何在外在公网环境下的远程访问威联通NAS…

1.5 安全机制

思维导图: 1.5 安全机制 X.800标准定义了一系列的安全机制,这些机制主要可分为两大类: 特定的安全机制:这些机制特定于某一协议层,例如TCP或应用层协议。普遍的安全机制:这些机制并不限制于任何特定的协议…

工行广州分行及Visa公司助力 华南理工大学启动科学健身“师生健康”嘉年华活动

千人同练瑜伽,伸展形体,拥抱美好自然; KPOP风格与华语流行音乐激情碰撞,人们在健身街舞课程中燃烧卡路里; 节拍强劲有力,人人跳起搏击操,尽情释放自我,争做夜空最闪耀的那颗星…… 1…

Spring 事务不生效的几种场景

Spring 事务不生效的几种场景 详细内容参考以下链接,这个链接是原文: spring 事务不生效的15中场景 非原创。 以下内容只是为了学习,加深印象,仅作为个人学习笔记, 请支持原创,内容请点击 spring 事务不生效…

手机桌面待办事项APP推荐,手机上可使用哪些待办事项APP

生活中,无论你是一名专业人士,学生,还是家庭主妇,总有各种各样的任务等待着你,有时候需要额外的工具来提醒和管理这些待办事项。手机上的待办事项APP软件成为了这个任务的好帮手,为我们提供了快速、方便的方…

STM32的bootloader程序(通过串口更新STM32应用程序)

1 什么是bootloader? Bootloader,也被称为引导加载程序,是操作系统启动过程中的一个重要组成部分。它是存储在非易失性存储器中的一段小程序,负责在操作系统内核运行之前加载并启动一些必要的系统组件。 当计算机开机后&#xff0…

C++设计模式_19_Memento 备忘录(理解,目前多使用序列化方案来实现)

Memento 备忘录模式也属于“状态变化”模式,它是一个小模式,在今天来看有些过时,当今已经很少使用当前模式实现需求,思想却不变(信息隐藏),目前多使用序列化方案来实现。本系列所介绍的模式&…

资深8年测试总结,接口测试常用测试点汇总(精辟详细)

目录:导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结(尾部小惊喜) 前言 接口测试是测试系…

【VPX630】青翼 基于KU115 FPGA+C6678 DSP的6U VPX通用超宽带实时信号处理平台

板卡概述 VPX630是一款基于6U VPX总线架构的高速信号处理平台,该平台采用一片Xilinx的Kintex UltraScale系列FPGA(XCKU115)作为主处理器,完成复杂的数据采集、回放以及实时信号处理算法。采用一片带有ARM内核的高性能嵌入式处理器…

当面试问你接口测试时,不要再说不会了

很多人会谈论接口测试。到底什么是接口测试?如何进行接口测试?这篇文章会帮到你。 前端和后端 在谈论接口测试之前,让我们先明确前端和后端这两个概念。 前端是我们在网页或移动应用程序中看到的页面,它由 HTML 和 CSS 编写而成…

Unity DOTS系列之Struct Change核心机制分析

最近DOTS发布了正式的版本, 我们来分享一下DOTS里面Struct Change机制,方便大家上手学习掌握Unity DOTS开发。 基于ArchType与Chunk的Entity管理机制 我们回顾以下ECS的内存管理核心机制,基于ArchTypeChunk的Entity管理模式。每个Entity不直接存放数据&#xff0c…

css矩形盒子实现虚线流动边框+css实现step连接箭头

由于项目里需要手写步骤条 且实现指定状态边框虚线流动效果&#xff0c;故使用css去绘制步骤条连接箭头和绘制边框流动效果 效果&#xff1a; 1.绘制步骤条连接箭头 <ul class"process-list"><div v-for"(process, index) in processes" :key&qu…

万圣节到了尽情狂欢吧Halloween is here Have a good time!

万圣节前夜是在10月31日庆祝的一个节日&#xff0c;根据传统&#xff0c;万圣节前夜的庆祝活动从太阳落山开始。Halloween is a holiday celebrated on October 31. By tradition, Halloween begins after sunset. 为了庆祝万圣节&#xff0c;孩子们化装成女巫、鬼和恶魔。To c…

『第十四章』雨燕的自我修养:Swift 调试技巧(下)

在本篇博文中,您将学到如下内容: 6. Xcode 界面调试6.1 Xcode 预览(Preview)7. 分析编译阶段8. 强大的 Instruments 工具9. Xcode 15 新结构化日志调试10. 一些调试小技巧总结离离原上草,一岁一枯荣. 野火烧不尽,春风吹又生 6. Xcode 界面调试 我们知道 App 在 Xcode 中运行…

kafka为什么如此之快?

天下武功&#xff0c;唯快不破。同样的&#xff0c;kafka在消息队列领域&#xff0c;也是非常快的&#xff0c;这里的块指的是kafka在单位时间搬运的数据量大小&#xff0c;也就是吞吐量&#xff0c;下图是搬运网上的一个性能测试结果&#xff0c;在同步发送场景下&#xff0c;…

一百九十七、Java——IDEA项目中把多层文件夹拆开显示

一、目的 由于IDEA项目中&#xff0c;默认的是把文件夹连在一起显示&#xff0c;于是为了方便需要把这些连在一起的文件夹拆开&#xff0c;分层显示 如文件夹cn.kgc 二、解决措施 解决方法很简单 &#xff08;一&#xff09;找到IDEA项目上的小齿轮 &#xff08;二&#xf…

QT实现用本地资源管理器来打开文件夹

QString path"文件夹路径";QDesktopServices::openUrl(QUrl("file:"path, QUrl::TolerantMode)); 在windows中QT编程&#xff0c;使用资源管理器来打开指定本地文件夹的方法&#xff1a; 第一种&#xff1a;使用Qprocess命令&#xff08;相当于在cmd命令管…

c语言基础:L1-064 估值一亿的AI核心代码

以上图片来自新浪微博。 本题要求你实现一个稍微更值钱一点的 AI 英文问答程序&#xff0c;规则是&#xff1a; 无论用户说什么&#xff0c;首先把对方说的话在一行中原样打印出来&#xff1b;消除原文中多余空格&#xff1a;把相邻单词间的多个空格换成 1 个空格&#xff0c…

生产环境接口频繁502

目录 基本信息 问题现象 问题原因 排查过程 解决方案 基本信息 客户名称&#xff1a;xx集团 产品名称&#xff1a;ATS 3.0微服务单体 版本号&#xff1a;3.1.14.X 问题分类&#xff1a;环境问题 环境类型&#xff1a;K8S 问题现象 单体组织计划的新增/修改功能&#xff0…

基于STM32的多功能智能密码锁控制设计

**单片机设计介绍&#xff0c;1653基于STM32的多功能智能密码锁控制设计 文章目录 一 概要二、功能设计设计思路 三、 软件设计原理图 五、 程序文档 六、 文章目录 一 概要 基于STM32的多功能智能密码锁控制设计是一种用STM32微控制器开发的系统&#xff0c;用于控制和管理密码…