Android.mk的理解

对Android.mk文件的理解:
在路径/home/archermind/source/source/ndk/docs下有个ANDROID-MK.html 文件,这个文件解释了源码路径下Android.mk 文件。
三个概念:
make:是一个命令工具;
makefile:定义了一系列的规则来指定,哪些文件需要先编译,哪些文件需要后编译,哪些文件需要重新编译,甚至于进行更复杂的功能操作,
         因为 makefile就像一个Shell脚本一样,其中也可以执行操作系统的命令,Android.mk 就是一个makefile文件,android使用的是GNU的make.
Android.mk :文件是GNU Makefile的一小部分,它用来对Android程序进行编译。
            对于APK程序 Android.mk的作用: 一般的Android程序,编译打包生成apk文件

引用ANDROID-MK.html中的例子看每行代码的含义:
---------- cut here ------------------
   LOCAL_PATH := $(call my-dir)

   include $(CLEAR_VARS)

   LOCAL_MODULE    := hello-jni
   LOCAL_SRC_FILES := hello-jni.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 由编译系统提供(可以在 android 安装目录下的/build/core/config.mk 文件看到其定义,为
CLEAR_VARS:=$(BUILD_SYSTEM)/clear_vars.mk),指定让GNU MAKEFILE该脚本清除许多 LOCAL_XXX 变量 ( 例如 LOCAL_MODULE ,
LOCAL_SRC_FILES ,LOCAL_STATIC_LIBRARIES,等等…),除 LOCAL_PATH。这是必要的,因为所有的编译文件都在同一个 GNU MAKE 执行环境
中,所有的变量都是全局的。所以我们需要先清空这些变量(LOCAL_PATH除外)。又因为LOCAL_PATH总是要求在每个模块中都要进行设置,所
以并需要清空它。该语句的意思就是把CLEAR_VARS变量所指向的脚本文件包含进来。
  LOCAL_MODULE := helloworld
  LOCAL_MODULE 变量必须定义,以标识 Android.mk 文件中描述的每个模块。名称必须是唯一的,而且不包含任何空格。
  LOCAL_SRC_FILES := helloworld.c
  LOCAL_SRC_FILES 变量必须包含将要编译打包进模块中的 C 或 C++源代码文件。
  include $(BUILD_SHARED_LIBRARY)
  BUILD_SHARED_LIBRARY 是编译系统提供的变量,指向一个 GNU Makefile 脚本(应该
就是在 build/core  目录下的 shared_library.mk) ,将根据LOCAL_XXX系列变量中的值,来编译生成共享库(动态链接库)。
如果想生成静态库,则用BUILD_STATIC_LIBRARY

猜你喜欢

转载自wcq20071334.iteye.com/blog/1779365