您的位置:首页 > 移动开发 > Android开发

Android.mk文件介绍

2012-10-28 11:49 309 查看
下面是我用cocos2d-x写的一款塔防游戏的demo



在编译到android平台的时候需要自己配置Android.mk文件,下面我就着这实例来介绍一下

首先Android.mk file用来向编译系统描述你的源代码信息的。具体来说:该文件是GNU Makefile的一小部分,会被编译系统解析一次或多次。

那什么是Makefile呢?

一般来说,c,c++等首先会将c,cpp等源代码文件编译成中间代码文件,即object file

在unix下面是.o 在windows下面是.obj ,如下图,是我用Cygwin在windows下面将Classes中源代码编译出来的



这个过程就是传说中的编译(compile),接下来的步骤就是链接(link)即将你程序的所有object file合成执行文件。

编译过程主要是代码文件的词法分析和语法分析,检测函数变量等声明是否正确 详解->http://baike.baidu.com/view/69568.htm

链接过程主要是将程序各个模块之间相互应用的部分处理好,使得各个模块之间能够正确的衔接起来。直接点说就主要是链接函数,全局变量等。

而要用的就是职权案编译好的目标中间文件(.o,.obj)

一般情况下都将这些o文件 obj文件打包也就是所谓的“库文件”(library file)

在unix下是 .a

在windows下是.lib

如下图,libdefensecommon.a文件就是将上图中所有.0文件打成的包,而其它.a文件是cocos2d-x引擎自动

为我们打的一些关于图片,网络,xml,声音模块的包



Android.mk可以有多个,我们可以在每一个Android.mk文件中定义一个或者多个模块。
只要正确填写了相应的编译信息,NDK的编译系统会自动为我们处理各种细节问题。
好了,铺垫了一通,现在我们来”实战“一下吧!
我工程中有两个Android.mk文件

根目录下的

和jni目录下的


来看看左边中的Android.mk文件(红色字体为解释)

//注: ‘:=’是赋值的意思;'+='是追加的意思;‘$’表示引用某变量的值。

// 一个Android.mk file首先必须定义好LOCAL_PATH变量。它表示是当前文件的路径。

//在这个例子中, 宏函数‘my-dir’, 由编译系统提供, 用于返回当前路径(即包含Android.mk file文件的目录)。

LOCAL_PATH := $(call my-dir)

//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,等等…)

include $(CLEAR_VARS)

//LOCAL_MODULE 变量必须定义,以标识你在 Android.mk 文件中描述的每个模块。名称必须是唯一的,而且不包含任何空格。注意编译系统

//会自动生合适的前缀和后缀,换句话说,一个被命名为'shared'的共享库模块,将会生成'libshared.so'文件。

//注意:如果把库命名为‘libhelloworld’,编译系统将不会添加任何的 lib 前缀,也会生成 libhelloworld.so。
LOCAL_MODULE := cocos_defense_common

LOCAL_MODULE_FILENAME := libdefensecommon

//LOCAL_SRC_FILES 变量必须包含将要编译打包进模块中的 C 或 C++源代码文件。不用

//在这里列出头文件和包含文件,编译系统将会自动找出依赖型的文件,当然对于包含文件,你包含时指定的路径应该正确。

//以下就我程序中所需要编译的cpp
LOCAL_SRC_FILES := \

Classes/tinystr.cpp\

Classes/tinyxml.cpp \

Classes/tinyxmlerror.cpp\

Classes/tinyxmlparser.cpp \

Classes/ArmedButton.cpp \

Classes/AttackWave.cpp\

Classes/BonusItem.cpp \

Classes/Creep.cpp\

Classes/CreepBean.cpp \

Classes/DialogLayer.cpp\

Classes/DTDialogView.cpp \

Classes/MapCenterScene.cpp \

Classes/MapCenterGUILayer.cpp\

Classes/GameHUD.cpp \

Classes/GameMediator.cpp\

Classes/GameScene.cpp \

Classes/HelpScene.cpp\

Classes/LevelData.cpp \

Classes/MainMenuScene.cpp \

Classes/MapData.cpp\

Classes/PathNode.cpp \

Classes/Soldier.cpp\

Classes/SoldiersSettingScene.cpp \

Classes/TileBean.cpp \

Classes/AppDelegate.cpp

//LOCAL_WHOLE_STATIC_LIBRARIES 指定模块所需要载入的完整静态库(这些静态库在链接是不允许链接器删除其中无用的代码)。

//通常这在你想往共享库中增加一个静态库时是非常有用的,共享库就会接受到静态库暴露出的content

//即我的程序中需要用到cocos2d-x已经编译好的 cocos2dx_static cocosdenshion_static cocos_extension_static静态库
LOCAL_WHOLE_STATIC_LIBRARIES := cocos2dx_static

LOCAL_WHOLE_STATIC_LIBRARIES += cocosdenshion_static

LOCAL_WHOLE_STATIC_LIBRARIES += cocos_extension_static

//定义这个变量用来记录C/C++编译器标志集合,并且会被添加到其他任何以LOCAL_STATIC_LIBRARIES和LOCAL_SHARED_LIBRARIES的模块的LOCAL_CFLAGS定义中。

LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)

// 一个BUILD_SHARED_LIBRARY
变量用于编译一个静态库。静态库不会复制到的APK包中,但是能够用于编译共享库

//这将会生成一个名为 lib$(LOCAL_MODULE).a 的文件
即 libdefensecommon.a

include $(BUILD_STATIC_LIBRARY)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: