一个Android.mk file用来向编译系统描述你的源代码。具体来说:该文件是GNU Makefile的一小部分,会被编译系统解析一次或多次。你可以在每一个Android.mk file中定义一个或多个模块,你也可以在几个模块中使用同一个源代码文件。编译系统为你处理许多细节问题。例如,你不需要在你的Android.mk中列出头文件和依赖文件。NDK编译系统将会为你自动处理这些问题。这也意味着,在升级NDK后,你应该得到新的toolchain/platform支持,而且不需要改变你的Android.mk文件。
先看一个简单的例子:一个简单的"hello world",比如下面的文件:
sources/helloworld/helloworld.c 
sources/helloworld/Android.mk
相应的Android.mk文件会象下面这样:
---------- cut here ------------------
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE
:= helloworld
LOCAL_SRC_FILES := helloworld.c
include $(BUILD_SHARED_LIBRARY)
---------- cut here ------------------
我们来解释一下这几行代码:
LOCAL_PATH := $(call my-dir) 
一个Android.mk file首先必须定义好LOCAL_PATH变量。它用于在开发树中查找源文件。在这个例子中,宏函数’my-dir’, 由编译系统提供,用于返回当前路径(即包含Android.mk file文件的目录)。
include $( CLEAR_VARS)
CLEAR_VARS由编译系统提供,指定让GNU MAKEFILE为你清除许多LOCAL_XXX变量(例如 LOCAL_MODULE, LOCAL_SRC_FILES, LOCAL_STATIC_LIBRARIES, 等等...),除LOCAL_PATH 。这是必要的,因为所有的编译控制文件都在同一个GNU MAKE执行环境中,所有的变量都是全局的。
LOCAL_MODULE := helloworld
LOCAL_MODULE变量必须定义,以标识你在Android.mk文件中描述的每个模块。名称必须是唯一的,而且不包含任何空格。注意编译系统会自动产生合适的前缀和后缀,换句话说,一个被命名为'foo'的共享库模块,将会生成'libfoo.so'文件。
LOCAL_SRC_FILES := helloworld.c 
LOCAL_SRC_FILES变量必须包含将要编译打包进模块中的C或C++源代码文件。注意,你不用在这里列出头文件和包含文件,因为编译系统将会自动为你找出依赖型的文件;仅仅列出直接传递给编译器的源代码文件就好。
在Android中增加本地程序或者库,这些程序和库与其所载路径没有任何关系,只和它们的Android.mk文件有关系。Android.mk和普通的Makefile有所不同,它具有统一的写法,主要包含一些系统公共的宏。
在一个Android.mk中可以生成多个可执行程序、动态库和静态库。
1,编译应用程序的模板:
#Test Exe
LOCAL_PATH := $(call my-dir)
#include $(CLEAR_VARS)
LOCAL_SRC_FILES:= main.c
LOCAL_MODULE:= test_exe
#LOCAL_C_INCLUDES :=
#LOCAL_STATIC_LIBRARIES :=
#LOCAL_SHARED_LIBRARIES :=
include $(BUILD_EXECUTABLE)
(菜鸟级别解释::=是赋值的意思,$是引用某变量的值)LOCAL_SRC_FILES中加入源文件路径,LOCAL_C_INCLUDES 中加入所需要包含的头文件路径,LOCAL_STATIC_LIBRARIES加入所需要链接的静态库(*.a)的名称,LOCAL_SHARED_LIBRARIES中加入所需要链接的动态库(*.so)的名称,LOCAL_MODULE表示模块最终的名称,BUILD_EXECUTABLE表示以一个可执行程序的方式进行编译。
2,编译静态库的模板:
#Test Static Lib
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_SRC_FILES:= /
helloworld.c
LOCAL_MODULE:= libtest_static
#LOCAL_C_INCLUDES :=
#LOCAL_STATIC_LIBRARIES :=
#LOCAL_SHARED_LIBRARIES :=
include $(BUILD_STATIC_LIBRARY)
一般的和上面相似,BUILD_STATIC_LIBRARY表示编译一个静态库。
3,编译动态库的模板:
#Test Shared Lib
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_SRC_FILES:= /
helloworld.c
LOCAL_MODULE:= libtest_shared
TARGET_PRELINK_MODULES := false
#LOCAL_C_INCLUDES :=
#LOCAL_STATIC_LIBRARIES :=
#LOCAL_SHARED_LIBRARIES :=
include $(BUILD_SHARED_LIBRARY)
一般的和上面相似,BUILD_SHARED_LIBRARY表示编译一个静态库。
以上三者的生成结果分别在如下,generic依具体target会变:
out/target/product/generic/obj/EXECUTABLE
out/target/product/generic/obj/STATIC_LIBRARY
out/target/product/generic/obj/SHARED_LIBRARY
每个模块的目标文件夹分别为:
可执行程序:XXX_intermediates
静态库:      XXX_static_intermediates
动态库:      XXX_shared_intermediates
另外,在Android.mk文件中,还可以指定最后的目标安装路径,用LOCAL_MODULE_PATH和LOCAL_UNSTRIPPED_PATH来指定。不同的文件系统路径用以下的宏进行选择:
TARGET_ROOT_OUT:表示根文件系统。
TARGET_OUT:表示system文件系统。
TARGET_OUT_DATA:表示data文件系统。
用法如:
CAL_MODULE_PATH:=$(TARGET_ROOT_OUT)

Android.mk 用法介绍相关推荐

  1. android.mk简单介绍

    application.mk简介: 0. 基础知识介绍: Application.mk用来描述应用程序需要哪些modules.Application.mk通常放在:$PROJECT/jni/Appli ...

  2. android.mk官网介绍,转载:Android.mk语法介绍

    Android.mk内的变量定义 3.1 LOCAL_PATH 一个Android.mk file首先必须定义好LOCAL_PATH变量.它用于在开发树中查找源文件.例如: 1.LOCAL_PATH: ...

  3. Android.mk用法详解

    Android.mk是Android提供的一个makefile文件,可以将源文件分组为模块.用来引用的头文件目录.需要编译的*.c/.cpp文件.jni源文件.指定编译生成.so共享库文件或者*.a静 ...

  4. Android AsyncTask用法介绍

    1>界面设计 1.1>效果 1.2>布局文件 <LinearLayout xmlns:android="http://schemas.android.com/apk/ ...

  5. Android画布的保存,Android canvas用法介绍之save()和restore()

    一. 首先讲一下canvas的save 和 restore功能. 这是canvas很有魅力的一个部分. onDraw方法会传入一个Canvas对象,它是你用来绘制控件视觉界面的画布. 在onDraw方 ...

  6. Android.mk 语法和变量介绍

    一.简介 Android.mk 是一种脚本语言,是将 C/C++ 源文件粘合至 NDK 的构建文件. 官网对 Android.mk 的介绍:https://developer.android.com/ ...

  7. Android.mk文件中的内容详解

    一.简介 在官网对 Android.mk 的介绍中写道: Android.mk 文件位于项目 jni/ 目录的子目录中,用于向构建系统描述源文件和共享库. 二.基础知识 这里介绍一些Android.m ...

  8. Android 编译过程介绍,Android.mk 和 Android.bp 分析, 在源码中编译 AndroidStudio 构建的 App

    目录 一.Android 编译 1. 编译流程 2. Soong 介绍 3. build.sh 二.Android.mk 解析 三.Android.bp 解析 1. 模块类型 2. 模块属性 四.An ...

  9. Android.mk文件详解介绍

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

最新文章

  1. 在JBuilder8在使用ANT
  2. 有时间看看这个方法 会不会 避免 xss
  3. centos7 服务器上的tomcat快速安装
  4. php cannot find libz,brew安装php70出现configure: error: Cannot find libz 错误解决方法
  5. XorPay.com 支付平台介绍【支持个人申请】
  6. art-template入门(三)之语法
  7. mysql insert 字符集_有关 MySQL 字符集的注意事项-爱可生
  8. 晨光文具卖出去的笔能绕地球几圈?
  9. 坦克乘员协同训练模拟系统
  10. 两个数和三个数的最大值和最小值宏定义
  11. javaint接收float_Java Float intValue()用法及代码示例
  12. 单片机蜂鸣器奏乐代码例子
  13. 用HTml+csss实现优惠券
  14. python判断ip是否可以ping通
  15. Python 实现发送QQ邮件(可加附件)
  16. Python Socket 编程详细介绍
  17. 浪潮信息成为龙蜥理事单位,共建开放计算生态和行业方案
  18. 我的舔狗日记网站制作
  19. lua java 加密解密_AES加解密多版本(GO、JAVA、Python)实现
  20. 虚电路和数据报网络——网络层

热门文章

  1. SpringBoot实现通用的接口参数校验
  2. 微服务架构如何影响软件开发文化?
  3. CV 方向,长期看好,短期谨慎?
  4. 一个妹子的美团面试经历,历经 4 轮 2 小时,成功拿到 Offer
  5. 再来一个吊打百度网盘的开源神器,还是99年妹子开发的
  6. RESTful之路由Routers
  7. Linux之远程登录、远程拷贝命令 ssh scp
  8. 爬虫之requests模块中cookies参数的使用
  9. 超赞!YOLOv5的妙用:学习手语,帮助听力障碍群体
  10. python05-字符串和字典