这是很久以前写的笔记,很不规范,内容也很不齐全,有时间再完善。
一个android.mk文件的基本内容如下:
LOCAL_PATH := $(call my-dir) # 定位mk文件的路径位置
include $(CLEAR_VARS) # 清理全局变量,避免互相干扰。
# 这样就是引入路径到NDK_MODULE_PATH中
$(call import-add-path,$(LOCAL_PATH)/platform/third_party/android/prebuilt)
LOCAL_MODULE := hello-jni # 生成的目标文件名
LOCAL_MODULE_FILENAME := mygame # 覆盖上面生成的目标文件名
LOCAL_SRC_FILES := hello-jni.c # 将要编译的源码
# 引入路径,相对目录默认是相对于NDK_ROOT的目录
LOCAL_C_INCLUDES := $(LOCAL_PATH)/../../Classes
# 要链接的库(static静态,shared动态),链接器会自动优化库,去除不会使用到的代码
LOCAL_STATIC_LIBRARIES := cocos2dx_static
# 链接阶段,链接器不能删除库的无用代码。
LOCAL_WHOLE_STATIC_LIBRARIES := libmobclickcpp
# 编译为动态库,STATIC静态库
include $(BUILD_SHARED_LIBRARY)
# 引入外部mk文件。相对路径是相对于NDK_MODULE_PATH的。这个东西在环境变量里。
# 如果设置不正确就会提示Are you sure your NDK_MODULE_PATH variable is properly defined。
$(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
- LOCAL_MODULE := foo-version-1
- LOCAL_MODULE_FILENAME := libfoo
注意: LOCAL_MODULE_FILENAME不支持文件路径(所以不能有斜杠),不要写扩展名(文件路径和文件扩展名是由编译工具自动加上的)
LOCAL_SRC_FILES (必须)
该变量用来指定该模块对应的源文件,只把需要传给编译器的源文件名加进LOCAL_SRC_FILES,编译系统会自动处理头文件依赖。这里的文件名都是以 LOCAL_PATH 作为当前目录的(即相对于LOCAL_PATH目录),例如:
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 这个版本开始,该变量可以支持多个扩展名了,例如:
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变量。