教程截图:
1.准备工作,配置开发环境:
开发环境:mac ox 10.7.3 + xcode4.2 + ndk r7 + eclipse helios
部署环境:中兴v880 root过了 刷2.3.5的rom, 模拟器是api 7 ,android 2.1
a、首先安装好xcode和eclipse,关于这两个工具的 安装就不多说了。xcode直接一个安装包next进行到底,而eclipse也有macos版的,不需要安装,绿色版。
b、然后,安装好cocos2d-x。我安装的版本是最新版cocos2d-1.0.1-x-0.11.0 release。(推荐使用git把源代码仓库clone下来,这样每次有更新的时候,只需要pull,然后花费少量的时间就可以获得最新版本了。关于git怎么使用,大家可以上网查,这个工具变得越来越流行了,现在说自己不会git都不好意思说自己是程序员了,呵呵,这话不是我说滴,别人说滴,但是确实有一定的道理在里面。大家不喜勿喷哈。)
下载完毕后,解压,打开终端(terminal),cd到刚刚解压的目录下面去,然后运行
./install-templates-xcode.sh -u -f
接下来,你会得到如下的输出:
cocos2d-x template installer
select the template version to install
3 for xcode3
4 for xcode4
input nothing for all
这里让你选择安装的模板类型,由于我使用的是xcode4,所以我输入4,如果你们喜欢3的话,这里就输入3,或者直接回车的话,就可以同时安装3和4.
选择4,回车,如下图所示:
Installing Xcode 4 Box2d iOS template
---------------------------------------------------- ...copying Box2D files
done! Installing Xcode 4 lua iOS template
---------------------------------------------------- ...copying lua files
done!
done!
当出现这样的提示的时候,就表示成功安装了。
c、接下来,配置android开发环境并安装NDK,同时设置一些环境变量。
这个过程,supersuraccoon已经在他的博客里面写好了,我这里拿来主义,不要见怪哈:)
4.1 确认已经安装JDK
可以使用命令 “java -version”
4.2 确认已经安装Ant (最好使用1.8.0或更新的版本)
可以使用命令 “ant -version”
4.3 安装Eclipse
我使用的是helios版本 (eclipse-jee-helios-SR1-macosx-cocoa), 其中包含了一些需要的插件(刚开始使用的是eclipse-SDK-3.7-macosx-cocoa,但是因为之后装ADT插件的时候报了一些错,于是就换掉了)
4.4 安装ADT插件
安装步骤:
http://developer.android.com/sdk/eclipse-adt.html
4.5 安装 Android SDK
如果有网络连接的话可以参考 安装步骤:
http://developer.android.com/sdk/installing.html 但是如果你和我一样没有网络连接的话过程就麻烦了:
4.5.1 下载所有需要的包
可以参考这个:
http://qdevarena.blogspot.com/2010/05/download-android-sdk-standalone-for.html
或者
http://azerdark.wordpress.com/2011/04/21/android-sdk-offline-installation/
4.5.2 把包解压到对应的位置 4.5.3 创建&&运行模拟器
然后,下载ndk r7,把它解压到一个比较容易找到的目录。我的是/Volumn/Mydata/android-ndk-r7b,然后sdk的安装目录是/Volumn/Mydata/android-sdk.我是联网安装的sdk,当时只选择了api7和api15,也就是android2.1和android3.0.
接下来是配置环境变量,打开terminal,然后输入下列语句:
vim ~/.bash_profile
然后按shift+g就会跳到文件最后,然后依次输入a,回车,把下面的语句复制到.bash_profile里面即可,路径根据自己安装sdk和ndk的路径作相应的修改即可:
export ANDROID_NDK_ROOT=/Volumes/Mydata/android-ndk-r7b
export COCOS2DX_ROOT=/Volumes/Mydata/guanghui/cocos2d-x
export NDK_ROOT=/Volumes/Mydata/android-ndk-r7b
export ANDROID_SDK_ROOT=/Volumes/Mydata/android-sdk
export PATH=$PATH:$ANDROID_NDK_ROOT
然后按esc ,再:wq(回车)保存好之后,就可以了。如果大家不喜欢vim,可以用其它编辑器,不过,由于./bash_profile是隐藏文件,所以你还要百度一下如何显示隐藏文件,呵呵。接下来,正式开始我们的跨平台游戏之旅啦。
2.创建一个iphone项目
这个非常简单,打开xcode,File->New->New project,然后选择cocos2d-x template,如下图所示:
然后把下载a Player image, a Projectile image, and a Target image.这三张图片,然后把它们放到工程的Resource目录下面去,并添加引用。
然后把HelloWorldScene.cpp的init方法替换成下面的代码:
// on "init" you need to initialize your instance
bool HelloWorld::init()
{
//////////////////////////////
// 1. super init first
if ( !CCLayerColor::initWithColor(ccc4(255, 255, 255, 255)))
{
return false;
} //add a ninjia sprite to the left screen center
CCSprite *ninjiaSprite = CCSprite::spriteWithFile("Player.png");
CCDirector *director = CCDirector::sharedDirector();
CCSize screenSize = director->getWinSize();
ninjiaSprite->setPosition(ccp(ninjiaSprite->getContentSize().width / 2.0f,
screenSize.height / 2.0f));
this->addChild(ninjiaSprite); CCSprite *targetSprite = CCSprite::spriteWithFile("Target.png");
targetSprite->setPosition(ccp(screenSize.width / 2.0f, screenSize.height / 2.0f));
this->addChild(targetSprite); return true;
}
编译并运行,你会看到如下图所示的输出:
好了,iphone项目创建好了,很简单吧,呵呵。接下来,让我们来创建android项目。
3.创建一个android项目
首先,打开终端,并输入:
cd $COCOS2DX_ROOT(回车)
./create-android-project.sh(回车)
然后,这时候,它会出现如下提示:
use global definition of NDK_ROOT: /Volumes/Mydata/android-ndk-r7b
use global definition of ANDROID_SDK_ROOT: /Volumes/Mydata/android-sdk
Input package path. For example: org.cocos2dx.example
前面两句提示脚本正式使用我们之前定义的环境变量,分别是我的android的sdk和ndk的安装路径。如果之前没有定义这两个变量,就会报错。
然后它要求我们输入java包的路径,还给出了sample,这里我输入com.andyque.simplegame,然后回车。
接下来,它就会出现:
Now cocos2d-x supports Android 2.1-update1, 2.2, 2.3 & 3.0
Other versions have not tested.
Available Android targets:
----------
id: 1 or "android-7"
Name: Android 2.1
Type: Platform
API level: 7
Revision: 3
Skins: HVGA, QVGA, WQVGA400, WQVGA432, WVGA800 (default), WVGA854
ABIs : armeabi
----------
id: 2 or "android-15"
Name: Android 4.0.3
Type: Platform
API level: 15
Revision: 2
Skins: HVGA, QVGA, WQVGA400, WQVGA432, WSVGA, WVGA800 (default), WVGA854, WXGA720, WXGA800
ABIs : no ABIs.
input target id:
这里指的是脚本检测到我当前系统安装的api,之前我说过了,我只安装了api7和api15.注意,上面还有一行:
Now cocos2d-x supports Android 2.1-update1, 2.2, 2.3 & 3.0
Other versions have not tested.
如果读者使用其它android版本,有可能会有问题哦,因为没有被测试过,大家可以帮忙测试一下,说不定还会被采纳,哈哈。
这里我选择1,因为我的手机安装的系统是2.3.5,等下我还要在我手机上跑呢。
接下来会提示你:
input target id:
1
input your project name:
我输入SimpleGame,然后回车:
Created project directory: /Volumes/Mydata/guanghui/cocos2d-x/SimpleGame
Created directory /Volumes/Mydata/guanghui/cocos2d-x/SimpleGame/src/com/andyque/simplegame
Added file /Volumes/Mydata/guanghui/cocos2d-x/SimpleGame/src/com/andyque/simplegame/SimpleGame.java
Created directory /Volumes/Mydata/guanghui/cocos2d-x/SimpleGame/res
Created directory /Volumes/Mydata/guanghui/cocos2d-x/SimpleGame/bin
Created directory /Volumes/Mydata/guanghui/cocos2d-x/SimpleGame/libs
Created directory /Volumes/Mydata/guanghui/cocos2d-x/SimpleGame/res/values
Added file /Volumes/Mydata/guanghui/cocos2d-x/SimpleGame/res/values/strings.xml
Created directory /Volumes/Mydata/guanghui/cocos2d-x/SimpleGame/res/layout
Added file /Volumes/Mydata/guanghui/cocos2d-x/SimpleGame/res/layout/main.xml
Added file /Volumes/Mydata/guanghui/cocos2d-x/SimpleGame/AndroidManifest.xml
Added file /Volumes/Mydata/guanghui/cocos2d-x/SimpleGame/build.xml
Added file /Volumes/Mydata/guanghui/cocos2d-x/SimpleGame/proguard.cfg
cp: /Volumes/Mydata/guanghui/cocos2d-x/HelloWorld/Resource/*: No such file or directory
这时cocos2d-x的android项目就建立好了。为了确保你的这个工程没有问题,你可以运行$COCOS2DX_ROOT/SimpleGame/android/build_native.sh这个脚本。
方法很简单,打开终端,输入
cd $COCOS2DX_ROOT/SimpleGame/android/
然后是:
./build_native.sh
tips:linux下面的命令和文件可以用tab键补全,windows下面也一样,不过有些童鞋有可能不知道,特此提醒一下。这样就不用一个字母一个字母去打了,麻烦不说,还容易出错。
默认情况下,所有的android项目都会建立在cocos2d-x的安装目录下面,同时里面的mk文件都是引用cocos2d-x下面的库和文件的。
但是,我们需要创建一个独立的,能够同时支持ios和android的项目,所以,接下来,我将教大家如果把刚刚创建的android项目集成到iphone项目里面去。
4.把android项目合并到iphone项目里面去
这一步比较繁琐,也比较容易出错,大家要看仔细了。
先看看,配置好后,xcode里面的工程文件Group布局吧:
这里面新添加了一个android文件夹,但是,xcode里面只看到一些sh和mk文件,但是,实际上,这些都只是引用,具体还要拷贝其它文件到项目里面来。
(说明:操作步骤就是,先把整个android文件夹拷贝到ios的同级目录,然后只添加上图中的引用。其实也可以不copy过来,直接添加引用,但是,那样就有问题。就是哪一天,你的文件移动了,会造成该项目的引用找不到。所以,为了方便管理,还是把android目录拷贝到项目中来。)
具体请往下看:
首先,选择一个你最喜欢的文本编辑器,然后cd到刚刚这个SimpleGame的android目录下面,然后打开terminal,输入:
vim makefile //然后会创建一个新的窗口,接着输入i进入编辑模式,然后键入下面3条语句
clean:
rm -rf libs/
rm -rf obj/
请特别注意,这里的clean:是顶格输入的,而两条rm语句是使用tab键缩进的。如果不缩进,则输入make clean的时候会报错。
输入完后,esc(回到命令模式) :wq 回车,保存并退出。ok,搞定,然后输入make clean,如果出现下面的输出,则表示ok了:
rm -rf libs/
rm -rf obj/
接下来,把一些android相关的文件拷贝到之前建好的ios项目下面去。(注意$符号+环境变量名,是你之前定义的目录的别名,即$COCOS2DX_ROOT表示你的cocos2dx的解压缩目录)
第一步,把android这个文件夹从$COCOS2DX_ROOT/SimpleGame/android/拷贝到iphone的工程目录下面去,和ios这个文件夹在同一目录。(最终的目录是SimpleGame/SimpleGame/android/)
第二步,把Android.mk这个文件从$COCOS2DX_ROOT/SimpleGame/Classes/拷贝到SimpleGame/SimpleGame/Classes/下面
第三步,把Android.mk从$COCOS2DX_ROOT/cocos2dx/拷贝到SimpleGame/SimpleGame/libs/cocos2dx/下面
第四步,把android文件夹从$COCOS2DX_ROOT/CocosDenshion拷贝到SimpleGame/SimpleGame/libs/CocosDenshion/下面去。
最后一步,把platform这个文件夹从$COCOS2DX_ROOT/cocos2dx/platform拷贝到SimpleGame/SimpleGame/libs/cocos2dx/下面去。
当然,这个platform有点大,大约有114M,其中除了android,third_party和ios这三个文件夹不能删除之外,其它文件夹全部可以删除,特别注意!!!!
不要删除那些文件,一个文件也不能删除!!!!
接下来,我们配置一下build_native.sh脚本,把它替换成如下所示:
# set params
NDK_ROOT=/Volumes/Mydata/android-ndk-r7b/
COCOS2DX_ROOT=../libs/cocos2dx
GAME_ROOT=../
GAME_ANDROID_ROOT=$GAME_ROOT/android
RESOURCE_ROOT=$GAME_ROOT/Resources # make sure assets is exist
if [ -d $GAME_ANDROID_ROOT/assets ]; then
rm -rf $GAME_ANDROID_ROOT/assets
fi mkdir $GAME_ANDROID_ROOT/assets # copy resources
for file in $RESOURCE_ROOT/*
do
if [ -d $file ]; then
cp -rf $file $GAME_ANDROID_ROOT/assets
fi if [ -f $file ]; then
cp $file $GAME_ANDROID_ROOT/assets
fi
done # build
$NDK_ROOT/ndk-build -C $GAME_ANDROID_ROOT $*
注意,这里的NDK_ROOT要改成你自己的路径。
然后修改android/jni/Android.mk,修改成下面的样子:
同时把Application.mk修改成下面的样子:
APP_STL := gnustl_static
APP_CPPFLAGS += -frtti
APP_MODULES := cocos2dx_static cocosdenshion_shared game_logic_static game_static
然后,把android/jni/helloworld/Android.mk修改成下面的样子:
然后把Classes/Android.mk修改成下面的样子:(以后游戏越做越大,则可以在LOCAL_SRC_FILES里面再添加源文件即可,当然,如果要使用box2d或者其它第三方库,
那么请期待下一篇教程:))
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := game_logic_static LOCAL_SRC_FILES := AppDelegate.cpp \
HelloWorldScene.cpp LOCAL_C_INCLUDES := $(LOCAL_PATH)/../libs/cocos2dx \
$(LOCAL_PATH)/../libs/cocos2dx/platform \
$(LOCAL_PATH)/../libs/cocos2dx/include \
$(LOCAL_PATH)/../libs/CocosDenshion/include \ LOCAL_STATIC_LIBRARIES := png_static_prebuilt
LOCAL_STATIC_LIBRARIES += xml2_static_prebuilt
LOCAL_STATIC_LIBRARIES += jpeg_static_prebuilt
LOCAL_WHOLE_STATIC_LIBRARIES += cocos2dx_static LOCAL_SHARED_LIBRARIES := cocosdenshion_shared include $(BUILD_STATIC_LIBRARY) $(call import-module,cocos2dx/platform/third_party/android/modules/libpng)
$(call import-module,cocos2dx/platform/third_party/android/modules/libxml2)
$(call import-module,cocos2dx/platform/third_party/android/modules/libjpeg)
然后打开终端,依次输入:
make clean
./build_native.sh
如果一切顺利,你将得到如下输出:
。。。(上面还有一大堆编译信息,注意不要有错误哦,有错误请贴出来)
Install : libcocosdenshion.so => libs/armeabi/libcocosdenshion.so
Compile++ thumb : game_logic_static <= HelloWorldScene.cpp
StaticLibrary : libgame_logic_static.a
SharedLibrary : libgame.so
Install : libgame.so => libs/armeabi/libgame.so
最后,打开eclipse,然后选择File->New->Project...,接着会出现如下对话框:
选择Android Project,Next
然后,选择从现有工程导入:(纠正一下,应该是选择Create project from exisiting source,然后Browse,定位到刚刚的android目录下面去。我有点懒,就不重新截图了)
然后,Next,选择android2.1:然后选择Finish。
最后,右键点工程,Run As Android Application。
过一会,模拟器就起来,时间有点长,不过一旦起来以后,之后编译安装程序还是比较快的。但是,感觉还是不如ios模拟器爽啊。
成功之后,就可以看到一个忍者还有一个妖怪啦。
不过,我不走运,黑屏,呵呵,不过没有关系,我们android/bin目录下面的SimpleGame.apk复制到我的sd卡里面,然后安装,运行结果正确。
下面是小v的截图:
后记:由于我刚开始学习android,所以配置用ndk编译cocos2dx的时候遇到了不少的问题。之后通过网络查找,基本上问题都得到了解决。特在此把解决方案跟大家分享一下,避免大家犯和我一样的错误。下面是一些我遇到的错误及解决方案。如果大家配置有什么问题,也请留言,或者我有遗漏什么地方,也请留言让我知道。我再补充完善。
trouble shooting:
1.如果把cocodension也配置也静态库,则会出现如下错误:
./obj/local/armeabi/libcocosdenshion.a(SimpleAudioEngineJni.o): In function `JNI_OnLoad':
/Volumes/Mydata/MyToolBox/Cocos2dxLib/SimpleGame/SimpleGame/android/jni/http://www.cnblogs.com/libs/CocosDenshion/android/jni/SimpleAudioEngineJni.cpp:21: multiple definition of `JNI_OnLoad'
./obj/local/armeabi/objs-debug/game_static/main.o:/Volumes/Mydata/MyToolBox/Cocos2dxLib/SimpleGame/SimpleGame/android/jni/helloworld/main.cpp:16: first defined here
collect2: ld returned 1 exit status
make: *** [obj/local/armeabi/libgame.so] Error 1
2.有时候模拟器上显示黑屏,但是程序没有出错误提示,这时候不妨把程序安装到真机上面试试
要论坛交流,请点击传送门!
参考文章:
http://gameit.ro/2012/01/creating-an-iphone-and-android-cocos2d-x-hybrid-project-updated/