概述

    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. 使用HashMap对象传递url參数有用工具类

    代码例如以下: package com.yanek.util; import java.util.ArrayList; import java.util.Collections; import jav ...

  2. LR翻页脚本并在每页实现业务操作

    性能需求:在列表中删除后有记录,或对列表中的每条记录进行操作(如点击每条记录的“单号”进入订单详情页面,或在列表中对每条记录进行“启用”.“停止”操作) 举例:Vuser脚本模拟用户在订单列表中点击每 ...

  3. WebSphere配置数据库连接池

    通过WebSphere配置数据库连接池一共需要三项:     1.配置连接驱动,在这里叫:JDBC提供程序;    2.配置数据库连接池,在这里叫:配置数据源;  3.配置数据库登录帐号,密码,在这里 ...

  4. KVO的概述的使用

    一,概述 KVO,即:Key-Value Observing,它提供一种机制,当指定的对象的属性被修改后,则对象就会接受到通知.简单的说就是每次指定的被观察的对象的属性被修改后,KVO就会自动通知相应 ...

  5. DotNet程序汉化过程--SnippetCompiler奇葩的字符串

    开篇前言 汉化的过程总会遇到各种各样的问题,让人抓狂,这一篇我就来讲解一下一个特殊的单词的汉化以及我的“艰辛历程”. 起因介绍 在SnippetCompiler有这么一个奇葩的字符串“查找>&g ...

  6. Jmail组件发送邮件说明ASP.NET

    ASP.Net环境下使用Jmail组件发送邮件2008-01-25 18:59实现过程: 不同于在Asp中使用Jmail,直接使用 Server.CreateObject("Jmail.Me ...

  7. Material Design说明

    原文链接: Material Design 引言 我们挑战自我,为用户创造了一种视觉语言,综合了好设计的经典原则,革新以及科技的可能性.这就是material design.这份说明是一个动态的文档, ...

  8. 【mac osx安装opencv,python总结】

    在macosx下安装opencv,最大的困难在于协调python版本.由于在opencv官网上,强烈建议安装完整版的python(不建议使用mac 内置的python),所以会碰到这个多个python ...

  9. 使用ganymed-ssh2-build通过ssh获得远程服务器参数

    1.项目中需要检测到几台远程服务器的参数,差了很多资料,决定用的这个 2.jar包:ganymed-ssh2-build210.jar 3.原理:向远程linux服务器发送脚本命令,得到该台服务器的信 ...

  10. Ftp不能登陆的解决方法

    ftp登陆不了是很经常碰到的事,很多人常常是不加分析就发贴询问.老实说,这样既浪费自己时间,又浪费别人精力,还常常不能得到满意的回答.因此每一位希望从ftp站点发现资源的朋友都有必要学会分析登陆失败的 ...