Android.mk

14 篇文章 0 订阅

原文链接:
https://developer.android.com/ndk/guides/android_mk.html
本页介绍用于将C和C++源文件粘合至Android NDK的Android.mk 构建文件的语法。

概念

Android.mk 文件位于项目 jni/ 目录的子目录中,用于向构建系统描述源文件和共享库。 它实际上是构建系统解析一次或多次的微小 GNU makefile 片段。 Android.mk 文件用于定义 Application.mk、构建系统和环境变量所未定义的项目范围设置。 它还可替换特定模块的项目范围设置。
Android.mk 的语法用于将源文件分组为模块。 模块是静态库、共享库或独立可执行文件。 可在每个 Android.mk 文件中定义一个或多个模块,也可在多个模块中使用同一个源文件。 构建系统只会将共享库放入应用软件包。 此外,静态库可生成共享库。
此文件的语法与随整个 Android 开放源代码项目分发的 Android.mk 文件中使用的语法非常接近。 虽然使用它们的构建系统实现不同,但类似之处在于,其设计决定旨在使应用开发者更容易重复使用外部库的源代码。

基础知识

详细了解语法之前,先了解 Android.mk 文件所含内容的基本信息很有用。 为此,本节使用 Hello-JNI 示例中的 Android.mk 文件,解释文件中的每行所起的作用。

Android.mk 文件必须首先定义 LOCAL_PATH 变量:

LOCAL_PATH := $(call my-dir)
此变量表示源文件在开发树中的位置。在这里,构建系统提供的宏函数 my-dir 将返回当前目录(包含 Android.mk 文件本身的目录)的路径。

下一行声明 CLEAR_VARS 变量,其值由构建系统提供。

include $(CLEAR_VARS)
CLEAR_VARS 变量指向特殊 GNU Makefile,可为您清除许多 LOCAL_XXX 变量,例如 LOCAL_MODULE、LOCAL_SRC_FILES 和 LOCAL_STATIC_LIBRARIES。 请注意,它不会清除 LOCAL_PATH。此变量必须保留其值,因为系统在单一 GNU Make 执行环境(其中所有变量都是全局的)中解析所有构建控制文件。 在描述每个模块之前,必须声明(重新声明)此变量。

接下来,LOCAL_MODULE 变量将存储您要构建的模块的名称。请在应用中每个模块使用一个此变量。

LOCAL_MODULE := hello-jni

每个模块名称必须唯一,且不含任何空格。构建系统在生成最终共享库文件时,会将正确的前缀和后缀自动添加到您分配给 LOCAL_MODULE 的名称。 例如,上述示例会导致生成一个名为 libhello-jni.so 的库。

注:如果模块名称的开头已是 lib,则构建系统不会附加额外的前缀 lib;而是按原样采用模块名称,并添加 .so 扩展名。 因此,比如原来名为 libfoo.c 的源文件仍会生成名为 libfoo.so 的共享对象文件。 此行为是为了支持 Android 平台源文件从 Android.mk 文件生成的库;所有这些库的名称都以 lib 开头。

下一行枚举源文件,以空格分隔多个文件:

LOCAL_SRC_FILES := hello-jni.c

LOCAL_SRC_FILES 变量必须包含要构建到模块中的 C 和/或 C++ 源文件列表。
最后一行帮助系统将所有内容连接到一起:

include $(BUILD_SHARED_LIBRARY)

BUILD_SHARED_LIBRARY 变量指向 GNU Makefile 脚本,用于收集您自最近 include 后在 LOCAL_XXX 变量中定义的所有信息。 此脚本确定要构建的内容及其操作方法。

示例目录中有更复杂的示例,包括您可以查看的带注释的 Android.mk 文件。 此外,示例:native-activity 详细说明了该示例的 Android.mk 文件。 最后,变量和宏提供本节中变量的进一步信息。

变量和宏

构建系统提供许多可用于 Android.mk 文件中的变量。其中许多变量已预先赋值。 另一些变量由您赋值。

除了这些变量之外,您还可以定义自己的任意变量。在定义变量时请注意,NDK 构建系统会预留以下变量名称:

以 LOCAL_ 开头的名称,例如 LOCAL_MODULE。
以 PRIVATE_、NDK_ 或 APP 开头的名称。构建系统在内部使用这些变量。
小写名称,例如 my-dir。构建系统也是在内部使用这些变量。
如果为了方便而需要在 Android.mk 文件中定义自己的变量,建议在名称前附加 MY_

NDK定义的变量

本节讨论构建系统在解析 Android.mk 文件之前定义的 GNU Make 变量。 在某些情况下,NDK 可能会多次解析 Android.mk 文件,每次使用其中某些变量的不同定义。

CLEAR_VARS

此变量指向的构建脚本用于取消定义下面“开发者定义的变量”一节中列出的几乎全部LOCAL_XXX变量。在描述新模块之前,使用此变量包括此脚本。使用它的语法为:

include $(CLEAR_VARS)

BUILD_SHARED_LIBRARY

此变量指向的脚本用于收集您在 LOCAL_XXX 变量中提供的模块所有相关信息,以及确定如何从列出的源文件构建目标共享库。 请注意,使用此脚本要求您至少已为 LOCAL_MODULE 和 LOCAL_SRC_FILES 赋值(如需了解有关这些变量的详细信息,请参阅模块描述变量)。
使用此变量的语法为:

include $(BUILD_SHARED_LIBRARY)

共享库变量导致构建系统生成具有.so拓展名的库文件。

BUILD_STATIC_LIBRARY

用于构建静态库的BUILDSHARED_LIBRARY的变体。构建系统不会将静态库复制到您的项目/软件包,但可能使用他们构建共享库(请参阅下面的LOCAL_STATIC_LIBRARIES和LOCAL_WHOLE_STATIC_LIBRARIES)。使用此变量的语法为:

include $(BUILD_STATIC_LIBRARY)

静态库变量导致构建系统生成扩展名为.a的库。

PREBUILT_SHARED_LIBRARY

指向用于指定预建共享库的构建脚本。与BUILD_SHAED_LIBRARY和BUILD_STATIC_LIBRARY的情况不同,这里的LOCAL_SRC_FILES值不能是源文件,而必须是指向预建共享库的单一路径,例如foo/libfoo.so。使用此变量的语法为:`

include $(PREBUILT_SHARED_LIBRARY)`

PREBUILT_STATIC_LIBRARY
与 PREBUILT_SHARED_LIBRARY 相同,但用于预构建的静态库。如需了解有关使用预建库的详细信息,请参阅使用预建库
TARGET_ARCH
Android 开放源代码项目所指定的目标 CPU 架构的名称。对于与 ARM 兼容的任何构建,请使用独立于 CPU 架构修订版或 ABI 的 arm(请参阅下面的 TARGET_ARCH_ABI)。

此变量的值取自您在 Android.mk 文件中定义的 APP_ABI 变量,系统将在解析 Android.mk 文件前读取其值。

TARGET_PLATFORM
作为构建系统目标的 Android API 级别号。例如,Android 5.1 系统映像对应于 Android API 级别 22:android-22。如需平台名称及相应 Android 系统映像的完整列表,请参阅 Android NDK 原生 API。以下示例显示了使用此变量的语法:

TARGET_PLATFORM := android-22

TARGET_ARCH_ABI
当构建系统解析此 Android.mk 文件时,此变量将 CPU 和架构的名称存储到目标。 您可以指定以下一个或多个值,使用空格作为多个目标之间的分隔符。 表 1 显示了要用于每个支持的 CPU 和架构的 ABI 设置。

以下示例显示如何将 ARMv8 AArch64 设置为目标 CPU 与 ABI 的组合:

TARGET_ARCH_ABI := arm64-v8a

TARGET_ABI
目标 Android API 级别与 ABI 的联接,特别适用于要针对实际设备测试特定目标系统映像的情况。 例如,要指定在 Android API 级别 22 上运行的 64 位 ARM 设备:

TARGET_ABI := android-22-arm64-v8a

模块描述变量
本节中的变量向构建系统描述您的模块。每个模块描述应遵守以下基本流程:

  1. 使用 CLEAR_VARS 变量初始化或取消定义与模块相关的变量。
  2. 为用于描述模块的变量赋值。
  3. 使用 BUILD_XXX 变量设置 NDK 构建系统,以便为模块使用适当的构建脚本。

LOCAL_PATH
此变量用于指定当前文件的路径。必须在Android.mk文件的开头定义它。以下示例向您展示如何操作:

LOCAL_PATH := $(call my-dir)

CLEAR_VARS 指向的脚本不会清除此变量。因此,即使您的 Android.mk 文件描述了多个模块,您也只需定义它一次。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值