Android.mk文件介绍

本文详细介绍了使用Cocos2d-x开发塔防游戏并将其编译到Android平台的过程,包括源代码管理、编译系统配置、模块构建等关键步骤,特别强调了Android.mk文件的使用及其对编译流程的影响。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

下面是我用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_LIBRARIESLOCAL_SHARED_LIBRARIES的模块的LOCAL_CFLAGS定义中。
LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)

 

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

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

include $(BUILD_STATIC_LIBRARY)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值