android.mk文件的作用:编译需要的cpp文件,生成.so动态库,供android端调用。
先上一个android.mk文件:
第一次创建项目,在Android平台编译时,都需要通过android.mk文件编译整个cocos2dx的库(第一次编译我们需要等待很长的时间.....)。
首先知道$(call import-module,dir_name)的作用,然后顺着lib/proj.android目录继续找对应目录下的android.mk文件
类似于递归一样,把所有目录下的android.mk文件都编译一次,最终把Cocos2dx库和自己的cpp文件打包成.so文件。
1)LOCAL_WHOLE_STATIC_LIBRARIES := quickcocos2dx
上面这句意思是包含quickcocos2dx的静态库,但是where is quickcocos2dx 的静态库呢?
移步进D:\quick-x\quick-cocos2d-x\lib\proj.android,查看该目录下的android.mk文件,大概内容如下:
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := quickcocos2dx #库名
LOCAL_MODULE_FILENAME := libquickcocos2dx
....
....
include $(BUILD_STATIC_LIBRARY) #编译静态的quickcocos2dx库
$(call import-module,cocos2dx) #继续编译cocos2dx目录下的android.mk文件
$(call import-module,CocosDenshion/android) #继续编译CocosDenshion/android目录下的android.mk文件
$(call import-module,extensions) #继续编译extensions目录下的android.mk文件
$(call import-module,scripting/lua/proj.android) #继续编译scripting/lua/proj.android目录下的android.mk文件
...
...
从上面的android.mk可以看到,quickcocos2dx 的静态库就是这个。
就这样,通过不断的编译android.mk文件,将cocos2dx的几个静态库生成,最终生成了目标的.so动态库。
这样,在android平台下,可以使用jni调用cocos2dx的库,这样就可以在手机上玩游戏了。
2)LOCAL_MODULE 跟 LOCAL_MODULE_FILENAME的区别
看具体的代码:
LOCAL_MODULE := quickcocos2dx
LOCAL_MODULE_FILENAME := libquickcocos2dx
上面两句代码,我的理解:
在android.mk文件编译的过程中,
使用的名字是quickcocos2dx(android.mk运行期使用的变量名,其它的mk文件可以通过quickcocos2dx来引用这个MODULE),
但是当编译完成,存储到外存,也就是硬盘上时(LOCAL_MODULE_FILENAME),使用的名字是:libquickcocos2dx
网上关于android.mk的文档一大把,推荐个讲的不错的,给我拨云见月的blog:
http://www.cnblogs.com/yaozhongxiao/archive/2012/03/06/2382362.html
并摘录些实用的文字:
++++++++++++++++++++++++++分割线++++++++++++++++++++++++++++++
1. Android编译系统分析 --- 系统变量解析
LOCAL_PATH - 编译时的目录
LOCAL_MODULE - 编译的目标对象
LOCAL_SRC_FILES - 编译的源文件
LOCAL_C_INCLUDES - 需要包含的头文件目录
LOCAL_SHARED_LIBRARIES - 链接时需要的外部库
LOCAL_PRELINK_MODULE - 是否需要prelink处理
BUILD_STATIC_LIBRARY - 指明要编译成静态库
BUILD_SHARED_LIBRARY - 指明要编译成动态库
(1). LOCAL_PATH - 编译时的目录
$(call 目录,目录….) 目录引入操作符: 如该目录下有个文件夹名称 src,则可以这样写 $(call src),那么就会得到 src 目录的完整路径
(2). include $(CLEAR_VARS) -清除之前的一些系统变量
CLEAR_VARS:= $(BUILD_SYSTEM)/clear_vars.mk
在 build/core/config.mk 定义 CLEAR_VARS:= $(BUILD_SYSTEM)/clear_vars.mk
通过include 包含自定义的.mk文件(即是自定义编译规则)或是引用系统其他的.mk文件(系统定义的编译规则)。
(3). LOCAL_SRC_FILES - 编译的源文件
可以是.c, .cpp, .java, .S(汇编文件)或是.aidl等格式, 不同的文件用空格隔开。
如果编译目录子目录,采用相对路径,如子目录/文件名。
也可以通过$(call 目录),指明编译某目录下所有.c/.cpp/.java/.S/ .aidl文件. 追加文件 LOCAL_SRC_FILES += 文件
(4). LOCAL_C_INCLUDES - 需要包含的头文件目录
可以是系统定义路径,也可以是相对路径. 如该编译目录下有个include目录,写法是include/*.h
(5). LOCAL_MODULE - 编译的目标对象
module 是指系统的 native code,通常针对c,c++代码
./system/core/sh/Android.mk:32:LOCAL_MODULE:= sh
./system/core/libcutils/Android.mk:71:LOCAL_MODULE := libcutils
(6). LOCAL_PACKAGE_NAME
Java 应用程序的名字用该变量定义
./packages/apps/Music/Android.mk:9:LOCAL_PACKAGE_NAME := Music
./packages/apps/Browser/Android.mk:14:LOCAL_PACKAGE_NAME := Browser
(7). 依赖库
LOCAL_SHARED_LIBRARIES - 链接时需要的外部共享库
LOCAL_STATIC_LIBRARIES - 链接时需要的外部外部静态
LOCAL_JAVA_LIBRARIES 加入jar包
(8). BUILD_SHARED_LIBRARY - 指明要编译成动态库。编译的目标,用include 操作符
BUILD_STATIC_LIBRARY --- 来指明要编译成静态库。
如果是java文件的话,用 BUILD_PACKAGE 来指明。会用到系统的编译脚本host_java_library.mk,