这是很久以前写的笔记,很不规范,内容也很不齐全,有时间再完善。
一个android.mk文件的基本内容如下:

  1. LOCAL_PATH := $(call my-dir) # 定位mk文件的路径位置
  2. include $(CLEAR_VARS) # 清理全局变量,避免互相干扰。
  3. # 这样就是引入路径到NDK_MODULE_PATH中
  4. $(call import-add-path,$(LOCAL_PATH)/platform/third_party/android/prebuilt)
  5. LOCAL_MODULE := hello-jni # 生成的目标文件名
  6. LOCAL_MODULE_FILENAME := mygame # 覆盖上面生成的目标文件名
  7. LOCAL_SRC_FILES := hello-jni.c # 将要编译的源码
  8. # 引入路径,相对目录默认是相对于NDK_ROOT的目录
  9. LOCAL_C_INCLUDES := $(LOCAL_PATH)/../../Classes
  10. # 要链接的库(static静态,shared动态),链接器会自动优化库,去除不会使用到的代码
  11. LOCAL_STATIC_LIBRARIES := cocos2dx_static
  12. # 链接阶段,链接器不能删除库的无用代码。
  13. LOCAL_WHOLE_STATIC_LIBRARIES := libmobclickcpp
  14. # 编译为动态库,STATIC静态库
  15. include $(BUILD_SHARED_LIBRARY)
  16. # 引入外部mk文件。相对路径是相对于NDK_MODULE_PATH的。这个东西在环境变量里。
  17. # 如果设置不正确就会提示Are you sure your NDK_MODULE_PATH variable is properly defined。
  18. $(call import-module,相对路径)

一、语法

参考:http://blog.csdn.net/smfwuxiao/article/details/8530742

$返回变量值

LOCAL_PATH

这个变量表示当前文件(一般是Android.mk)所在的路径,该变量很重要,必须定义(在Android.mk文件的开头处定义)。常见写法如下:
LOCAL_PATH := $(call my-dir)
该变量不会被 include $(CLEAR_VARS) 清空,所以不论Android.mk定义了几个模块,一个Android.mk只需要在开头定义一次即可。

LOCAL_MODULE

该变量定义当前模块的名字,名字必须唯一,不能有空格。这个变量必须在 include $(BUILD_XXX) 之前定义好。默认情况下,这里的名字会用来得到输出文件的名字。例如模块名为foo,则得到的输出文件为libfoo.so。但是,如果你要在其他模块的Android.mk文件或Application.mk中引用这个模块,应该用foo这个模块名,而不要用libfoo.so这个文件名。

LOCAL_MODULE_FILENAME (可选)

该变量可以用来重定义输出文件的名字。默认情况下,foo模块得到的静态库的名字为 libfoo.a,动态库的名字为libfoo.so(UNIX规范)。当定义了LOCAL_MODULE_FILENAME之后,输出文件名就是这个变量指定的名字,例如:
[plain] view plain copy

  1. LOCAL_MODULE := foo-version-1
  2. LOCAL_MODULE_FILENAME := libfoo

注意: LOCAL_MODULE_FILENAME不支持文件路径(所以不能有斜杠),不要写扩展名(文件路径和文件扩展名是由编译工具自动加上的)

LOCAL_SRC_FILES (必须)

该变量用来指定该模块对应的源文件,只把需要传给编译器的源文件名加进LOCAL_SRC_FILES,编译系统会自动处理头文件依赖。这里的文件名都是以 LOCAL_PATH 作为当前目录的(即相对于LOCAL_PATH目录),例如:

  1. LOCAL_SRC_FILES := foo.c toto/bar.c<br />注意:必须使用Unix风格的斜杠,Windows风格的斜杠不能正确处理。

LOCAL_C_INCLUDES

一个路径的列表,是NDK根目录的相对路径(LOCAL_SRC_FILES中的文件相对于LOCAL_PATH)。当编译C/C++、汇编文件时,这些路径将被追加到头文件搜索路径列表中。例如:
LOCAL_C_INCLUDES := sources/foo
或者, LOCAL_C_INCLUDES := $(LOCAL_PATH)/../foo

这里的搜索路径会放在LOCAL_CFLAGS/LOCAL_CPPFALGS等标志的前面。 当使用ndk-gdb的时候,LOCAL_C_INCLUDES中的路径也会被用到。

LOCAL_CPP_EXTENSION (可选)

用来定义C++代码文件的扩展名。必须以句点开头(即 “.”),默认值是“.cpp”,可以修改,例如:
LOCAL_CPP_EXTENSION := .cxx
从 NDK r7 这个版本开始,该变量可以支持多个扩展名了,例如:

  1. LOCAL_CPP_EXTENSION := .cxx .cpp .cc

CLEAR_VARS
是编译系统预定义的一个变量,它指向一个特殊的Makefile,这个Makefile负责清除 LOCAL_xxx 的变量(例如 LOCAL_MODULE, LOCAL_SRC_FILES, LOCAL_STATIC_LIBRARIES 等)但不会清除 LOCAL_PATH。之所以需要清理这些变量是因为所有的编译控制文件是在一趟make执行过程中完成的,而所有的变量都是全局的,会对其他Android.mk文件产生影响。

import-module

该函数用于按模块名查找另一个模块的Android.mk文件,并包含进来。用法如下:
$(call import-module,)

上面将在 NDK_MODULE_PATH变量所指定的目录列表中寻找名为的模块,找到之后将包含进来。

LOCAL_STATIC_LIBRARIES

指定应该链接到当前模块的静态库(可指定多个)。当前模块是动态库时,该选项才有意义。

LOCAL_SHARED_LIBRARIES

指定的是运行时该模块所依赖共享库(可指定多个)。这些信息是链接阶段必须的。

LOCAL_WHOLE_STATIC_LIBRARIES

它是LOCAL_STATIC_LIBRARIES的变体,用来表示它对应的模块对于linker来说应该是一个“whole archive”(见GNU linker 文档,关于 —whole-archive的资料)。当静态库之间有循环依赖时,会用到这个选项。注意,当编译动态库时,这个选项会强行把所有的对象文件组装到一起;不过,在编译可执行文件的时候情况不是这样的。

include $(BUILD_SHARED_LIBRARY)

这个 BUILD_SHARED_LIBRARY也是预定义的变量,也是指向一个Makefile,负责将你在 LOCAL_XXX 等变量中定义信息收集起来,确定要编译的文件,如何编译。如果要编译的是静态库而不是动态库,则可以用 BUILD_STATIC_LIBRARY。

在NDK安装目录的samples目录下有更加丰富的例子,里面都有详细的注释。

import-add-path

$(call import-add-path,$(LOCAL_PATH)/libsrc)1、解释:import-add-path中文:增加自己的路径到 NDK_MODULE_PATH 环境变量中,再非ndk根目录/sources下编译时会用到

在import module语句之前加入,
$(call import-add-path,$(LOCAL_PATH)/platform/third_party/android/prebuilt)
将一个新的路径加入NDK_MODULE_PATH变量。