quick cocos 或者 Cocos2dx 项目下的Android.mk文件的学习

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,

posted @ 2014-06-30 11:41  Mr轨迹  阅读(1545)  评论(0编辑  收藏  举报