概述

    Android.mk文件用来向编译系统描写叙述怎样编译你的源码。更确切地说,该文件事实上就是一个小型的Makefile。由于该文件会被NDK的编译工具解析多次,因此应该尽量降低源码中声明变量,由于这些变量可能会被多次定义从而影响到后面的解析。这个文件的语法同意把源码组织成模块。每一个模块属于下列类型之中的一个:
  • APK程序:一般的Android程序。编译打包生成apk文件。

  • JAVA库:java类库。编译打包生成jar包文件。
  • C\C++应用程序:可运行的C/C++应用程序。
  • C\C++静态库:编译生产C/C++静态库。并打包成.a文件。
  • C\C++共享库:编译生成共享库。并打包成.so文件,有且仅仅有共享库才干被安装/拷贝到APK包中。


举例

    这里參考了网上一个通用的样例,编译简单的“Hello World”,来说明一下Android.mk编写。比如以下的文件:
1. sources/test/hello.c
2. sources/test/Android.mk
    当中“hello.c”是一个JNI共享库。实现返回“hello world”字符串的原生方法。

因此,Android.mk文件内容例如以下:

LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := hello
LOCAL_SRC_FILES := hello.c
include $(BUILD_SHARED_LIBRARY)

解释一下这几行代码:

1. LOCAL_PATH := $(call my-dir) : 一个Android.mk文件首先必须定义好LOCAL_PATH变量,用于在开发树中查找源文件。

在这个样例中,宏函数my-dir由编译系统提供,用于返回当前路径(即包括Android.mk文件的文件夹)。

2. include $(CLEAR_VARS):CLEAR_VARS由编译i系统提供,指定让GNU MAKEFILE清除除了LOCAL_PATH变量外的很多LOCAL_***变量(比如:LOCAL_MODULE、LOCAL_SRC_FILES等)。

这是很有必要的。由于全部的编译文件都在同一个GUN MKAE运行环境中,全部的变量都是全局变量。不清除easy引起解析错误。

3. LOCAL_MODULE := hello:LOCAL_MODULE变量必须定义,用来标识在Android.mk文件描写叙述的每个模块。并且名称必须是唯一的。并且不能包括空格。编译系统会自己主动产生合适的前缀和后缀,比方一个被命名为hello的共享库模块。将会生成libhello.so文件。假设把库命名为libhello。编译系统将不会加入不论什么lib前缀,也会生成libhello.so文件。

4. LOCAL_SRC_FILES := hello.c:LOCAL_SRC_FILES变量必须包括将要编译打包进模块中的源码文件。
5. include $(BUILD_SHARED_LIBRARY):BUILD_SHARED_LIBRARY是编译系统提供的变量,指向一个GNU Makefile脚本(应该就是build/core文件夹下的shared_library.mk),负责收集自从上次调用include $(CLEAR_VARS)以来,定义在LOCAL_***变量中的全部信息。而且决定编译什么,怎样正确地去做,并依据其规则生成静态库。
6. 解释一下Android.mk里变量定义字符":="。“:=”类似于c中的宏,即在定义处明白展开。全然进行文本替换。

模块描写叙述变量

     以下的变量用于向系统描写叙述我们自己的模块,它应该定义在include $(CLEAR_VARS)和include $(BUILD_***)之间。正如前面讲述的那样,$(CLEAR_VARS)是一个脚本,清除全部这些变量,除非在描写叙述中显示注明。
1. LOCAL_PATH:这个变量用于给出当前文件的路径。必须在Android.mk的开头定义。能够这样使用:LOCAL_PATH := $(call my-dir)。这样这个变量不会被$(CLEAR_VARS)清除。由于每一个Android.mk仅仅须要定义一次(即使一个文件里定义了多个模块的情况下)。

2. LOCAL_SRC_FILES:当前模块包括的全部源码文件。

3. LOCAL_MODULE:当前模块的名称,这个名称应当是唯一的。而且不能包括空格。模块间的依赖关系就是通过这个名称来引用的。

4. LOCAL_MODULE_CLASS:标识所编译模块最后放置的位置。

ETC表示放置在/system/etc.文件夹下。APPS表示放置在/system/app文件夹下,SHARED_LIBRARIES表示放置在/system/lib文件夹下。假设详细指定,则编译的模块不会放到编译系统中。最后会在out相应product的obj文件夹下的相应文件夹中。

5. LOCAL_SRC_FILES:这是要编译的源码文件列表。仅仅要列出要传递给编译器的文件就可以。编译系统会自己主动计算依赖关系。源码文件路径都是相相对于LOCAL_PATH的。因此能够使用相对路径进行描写叙述。

6. LOCAL_JAVA_LIBRARIES:当前模块依赖的Java共享库,也叫Java动态库。

比如framework.jar包。

7. LOCAL_STATIC_JAVA_LIBRARIES:当前模块依赖的Java静态库,在Android里。导入的jar包和引用的第三方project都属于Java静态库。

8. LOCAL_STATIC_LIBRARIES:当前模块在执行时依赖的静态库的名称。

9. LOCAL_SHARED_LIBRARIES:当前模块在执行时依赖的动态库的名称。

10. LOCAL_C_INCLUDES:c或c++语言须要的头文件的路径。
11. LOCAL_CFLAGS:提供给C/C++编译器的额外编译參数。
12. LOCAL_PACKAGE_NAME:当前APK应用的名称。

13. LOCAL_CERTIFICATE:签署当前应用的证书名称。

14. LOCAL_MODULE_TAGS:当前模块所包括的标签,一个模块能够包括多个标签。标签的值可能是eng、user、debug、development、optional。当中,optional是默认标签。

15. LOCAL_DEX_PREOPT:apk的odex优化开关,默认是false。


    除此之外。Build系统中还定义了一些函数方便在Android.mk中使用。包含:

1. $(call my-dir):获取当前目录的路径。

2. $(call all-java-files-under, <src>):获取指定文件夹下的全部java文件。

3. $(call all-c-files-under, <src>):获取指定文件夹下的全部c文件。

4. $(call all-Iaidl-files-under, <src>):获取指定文件夹下的全部AIDL文件。

5. $(call all-makefiles-under, <folder>):获取指定文件夹下的全部Make文件。

6. $(call intermediates-dir-for, <class>, <app_name>, <host or target>, <common?>):获取Build输入的目标目录路径。

Android.mk具体解释的更多相关文章

  1. Android.mk参数解释

    -------------------- 下面对Android.mk 中经常出现的变量进行讲解 -------------------- 这些变量,你会经常在Android.mk文件中见到,下面以字表 ...

  2. Android.mk文件官方使用说明

    本页介绍了 ndk-build 所使用的 Android.mk 编译文件的语法. 概览 Android.mk 文件位于项目 jni/ 目录的子目录中,用于向编译系统描述源文件和共享库.它实际上是编译系 ...

  3. Android.mk 基本应用

    如果是在android源码里面编译我们自己的应用,就需要这个android.mk文件,这个文件就告诉android系统应用如何来编译这个应用以及这个应用它所依赖哪些文件等等信息.我对android.m ...

  4. Android.mk的用法和基础【转】

    一个Android.mk file用来向编译系统描述你的源代码.具体来说:该文件是GNU Makefile的一小部分,会被编译系统解析一次或多次.你可以在每一个Android.mk file中定义一个 ...

  5. Android.mk 常用宏和变量

    android ndk开发有一个重要的文件 Android.mk,他虽然重要,但是对它进行深入介绍的文档却比较的少,这里将对Android.mk中常用的宏和变量进行说明: 由于这一部分的内容多,资料零 ...

  6. Android.mk文件语法规范 原文

    序言:------------- 此文档旨在描述Android.mk文件的语法,Android.mk文件为Android NDK(原生开发)描述了你C/C++源文件.为了明白下面的内容,你必须已经阅读 ...

  7. Android.mk

    Introduction: Android.mk编译文件是用来向Android NDK描述你的C,C++源代码文件的, 这篇文档描述了它的语法.在阅读下面的内容之前,假定你已经阅读了docs/OVER ...

  8. Android NDK开发之Android.mk文件

    Android NDK开发指南---Android.mk文件 博客分类: Android NDK开发指南   Android.mk文件语法详述 介绍: ------------ 这篇文档是用来描述你的 ...

  9. 【整理修订】Android.mk详解

    Android.mk详解 1. Android.mk 的应用范围 Android.mk文件是GNU Makefile的一小部分,它用来对Android程序进行编译. 一个Android.mk文件可以编 ...

随机推荐

  1. hdu1978How many ways (记忆化搜索+DFS)

    Problem Description 这是一个简单的生存游戏,你控制一个机器人从一个棋盘的起始点(1,1)走到棋盘的终点(n,m).游戏的规则描述如下: 1.机器人一开始在棋盘的起始点并有起始点所标 ...

  2. UltraEdit 和Notepad++ 使用ftp直接编辑linux上文件

    安装ftp服务 apt-get install vsftpd 安装完后更改相关配置文件 /etc/vsftpd.conf cp /etc/vsftpd.conf /etc/vsftpd.conf.ol ...

  3. 内存测试工具memtester

    Memtester是用户态工具,用于测试内存子系统的故障.非常方便,支持32位 或64位Unix-like系统.对于硬件开发开发者来说,memtester可以定位到物理地址. 1. 安装 下载地址ht ...

  4. Private Members in JavaScript

    Private Members in JavaScript Douglas Crockford www.crockford.com JavaScript is the world's most mis ...

  5. mercurial(Hg) Server 搭建 过程记录

    mercurial(Hg) Server 搭建 过程记录 1.  环境说明 只是测试搭建,环境为本机开发环境:win 8.1 + IIS8.5 软件准备: 2.  软件安装 先安装Python2.7, ...

  6. Session与Cookie间不得不说的一些事

    在很久很久以前,刚有浏览器和网页的时候,web开发者发现了一个问题,我必须要在客户端这边保存一些东西才能实现某些功能,比如大家喜闻乐见的购物车.用户登录.自动登陆等.但是客户端只有一个浏览器,怎么在用 ...

  7. Java中循环删除list中元素的方法总结

    印象中循环删除list中的元素使用for循环的方式是有问题的,但是可以使用增强的for循环,然后在今天使用的时候发现报错了,然后去科普了一下,发现这是一个误区.下面我们来一起看一下. Java中循环遍 ...

  8. ubuntu中安装eclipse

    1.下载eclipse安装包 http://mirror.neu.edu.cn/eclipse/technology/epp/downloads/release/kepler/SR2/eclipse- ...

  9. 【JAVA编码专题】 JAVA字符编码系列三:Java应用中的编码问题

    这两天抽时间又总结/整理了一下各种编码的实际编码方式,和在Java应用中的使用情况,在这里记录下来以便日后参考. 为了构成一个完整的对文字编码的认识和深入把握,以便处理在Java开发过程中遇到的各种问 ...

  10. 关于页面刷新或者调用方法事获取不到元素信息或者出现缺少对象错误的换位思考setTimeout的使用

    这两天客户的需求不能定下来,做闲人好长时间了,不如来整理下最近碰到的一些个小麻烦. 正题: 场景一. 最近在开发的过程中使用到了百度的富客户端文本编辑器(ueditor)---这是一款功能很强大的文本 ...