cocos2d-x游戏发布交叉编译成安卓程序(二)交叉编译

cocos2d-x交叉编译到android,需要先搭建安卓开发环境,如果还没有搭建的朋友,这里是传送门:http://blog.csdn.net/u013174689/article/details/18554005

开发环境搭建好后,我们就可以开始交叉编译。

1.在cocos2d-2.0-x-2.0.4根目录文件夹找到并点击create-android-project.bat新建andorid项目。

如果第一次使用create-android-project.bat文件,可能会有报错。

提示错误,Could‘t find Cygwin at "e:\cygwin\bin"

关闭后右键选择编辑create-android-project.bat文件,

快捷键ctrl+F打开查找,查找到e:\cygwin\bin所在的位置,例如我的安装路径是D:\cygwin\bin,因此修改为D:\cygwin\bin

关闭后再次执行create-android-project.bat文件,再次提示错误Could‘t find android sdk tools at "e:\android\android-sdk\tools"

同理,编辑修改create-android-project.bat文件中android sdk tools自己的安装路径。例如我的是E:\adt-bundle-windows-x86-20131030\sdk\tools

关闭后再次执行create-android-project.bat文件,再次提示错误Could‘t find ndk at "e:\android\android-ndk-r8"

同理,编辑修改create-android-project.bat文件中ndk自己的安装路径。例如我的是E:\android-ndk-r7

关闭后再次执行create-android-project.bat文件显示已经可以正常运行,创建项目。我们按照它的提示输入资料。

双击create-android-project.bat,运行脚本文件,脚本需要你填写的信息有。

(1)package path(自己定义的java 工程的包名)请参考他们example的格式写,否则可能会导致不能创建完整。例如我输入的是u013174689.csdn.blog
(这个其实也是随便取的,但是一般来说是域名的倒置,当然你取x.o.x.o也是可以的,但是这个有个要注意的是,要保证唯一性,也就是你确定别人不会用这个名字,而且你写的别的应用最好也不要用相同重名的。因为这个当编译为android包时,就代表了android应用的唯一标识,如果你的这个名字和别的包名字相重,那么你的这个apk将无法和别的apk共存在手机里面,加上现在的应用市场都有验证机器,也就代表你的apk无法发布到应用市场去。)
(2)project name(自己定义的工程名字)如下图中例子中我输入的是hellotest,然后按回车键
 
(3)android targets(对应的android版本)建议选择低一些的版本,因为这里指的是兼容的android最低版本。  
鼠标拉到最上面,查看到最低可兼容的安卓版本号对应的id是7,
然后我们拉到最后面,填入版本号对应的id,如下图红色框中我输入id:7。
稍等一段时间,打开cocos2d-x根目录,我们可以发现一个你刚刚新建的目录,例如我新建的名字是hellotest目录如下:
 
双击打开看到如下图所示:

点击打开新建的安卓项目的proj.android文件夹可以看如下图所示。如果看到这些文件和文件夹都有就表示创建成功了哦!

 

2.把我们需要编译的目标项目,其目录下的Classes文件夹下面的所有文件全部复制到刚才新建的android项目(即例如我的hellotest)下面的Classes文件夹下面(删除原来的文件再复制粘贴)。

我用的是大神无幻博客里的这个项目SimpleGame的代码做的,http://blog.csdn.net/akof1314/article/details/8268882 

因为从他提供的源文件的文件结构可以显然看出,他已经成功交叉编译到安卓。

他的帖子中有提供源码下载地址,我们以他这个例子做试验,可以避免因为代码错误导致报错而难以学习。

接着把该SimpleGame项目目录下的Resources文件夹下面的所有资源全部复制粘贴到刚才新建的android项目(即例如我的hellotest)的Resources文件夹下面(删除原来的文件再复制粘贴)。

 

3.把该SimpleGame项目目录下的proj.win32文件夹下面的你自己新建的.cpp文件和.h文件全部复制粘贴到刚才新建的android项目(即例如我的hellotest)下面的Classes文件夹下面。我没有新建的.cpp文件和.h文件放到这里,而是都指定放到classes里面了 所以不用复制。

 

4.进入android项目(即例如我的hellotest文件夹)的proj.android\jni文件夹下面,用VC++打开Android.mk文件(先打开vc++软件,然后把Android.mk文件拖进去),如果该mk文件拒绝访问可能是需要修改了一下权限。

(提醒一下:Android.mk文件有两个,必须是jni文件夹下面的,如果你的项目中没有jni这个文件说明之前create-android-project.bat新建andorid项目有问题的,请先倒回去解决项目创建问题。)

 

 该mk文件的意思是:让我们添加Classes文件夹下面所有要编译的.cpp文件,自己一个个把cpp的名字手动添加进去。

我们参考上图红框中的格式添加自己的.cpp文件,这个例子比较简单,只是比它多了一个GameOverLayer.cpp,于是改为如下:

LOCAL_SRC_FILES := hellocpp/main.cpp \
                   ../../Classes/AppDelegate.cpp \
                   ../../Classes/HelloWorldScene.cpp \
                   ../../Classes/GameOverLayer.cpp

题外话:如果你有几百的cpp,咋办? 一个个手动添加??尼玛,这不是太恐怖了吗?好几位大神为此已经想出改善的办法,可以找谷哥和度娘看看。提供其中一个参考资料:http://blog.csdn.net/z104207/article/details/11574339,建议以后再尝试。

5. build_native.sh文件修改路径和使用

(1)第一次用build_native.sh,需要先修改.bash_profile文件,通过用bash_profile文件对NDK_ROOT进行设置。

我们在cygwin的安装目录下的home文件夹中找到某个用户下的.bash_profile文件,

最好是使用UltraEdit编辑不要转化格式,因为在window下和linux中回车符是不相同的。

在window里用记事本或者写字版打开修改bash_profile后会有错误提示,不过这个错误提示解决方法也简单,后面会介绍。

 

我的NDK路径是e:/android-ndk-r7你参考自己的修改。

我直接右键写字板打开,我们需要在该文件最后加入一下两行,如下图:

NDK_ROOT=/cygdrive/e/android-ndk-r7

export NDK_ROOT

 运行Cygwin Terminal软件时,可能会提示以下错误:

-bash: /home/lenovo/.bash_profile: line 47: syntax error: unexpected end of file

我们可以通过以下的方法解决:

直接CTRL+C复制dos2unix -n .bash_profile .bash_profile这句然后在cygwin中右键粘贴输入回车。

可以看到提示语dos2unix: converting file .bash_profile to file .bash_profile in Unix format ...就可以了

到此,NDK_ROOT设置ok了!

其实NDK_ROOT设置方法有很多,不一定要修改bash_profile文件,也可以用其他方法设置有兴趣的朋友可以找度娘和谷歌看看。

 

(3)在android项目的proj.android文件夹下面找到build_native.sh 文件 

打开开始菜单——所有程序——Cygwin Terminal软件,然后直接把build_native.sh 文件拖动到cygwin软件中,我们就可以看到画面如下图所示即软件自动把文件的路径添加进去了。然后按回车,等待编译需要一点时间,然后看是否编译成功。

编译成功之后,会直接在testandroid\proj.android\libs\armeabi这个目录底下生成so文件(libgame.so) ,如下图。

有些朋友如果是第一次使用build_native.sh文件,可能看不到上面的so文件(libgame.so),而是遭遇各种错误提示。

我们可能会遇到各种各样的错误提示,错误的可能原因很多,例如:NDK_ROOT未设置,或者用户权限问题,或者是不同的NDK版本之间的细微差异而导致的不一样等。

建议把错误提示复制到谷哥或者度娘,看看网友们是怎么解决的,跟着尝试。

如果用的是自己写的项目代码,可能会因为代码的原因会有一些报错,要耐心一一解决哦。

第一次尝试交叉编译的童鞋,建议用代码方面肯定没有问题的项目,这样会比较容易上手。

我用NDK r7版本,很幸运只有1个报错:

Android NDK: Host 'awk' tool is outdated. Please define HOST_AWK to point to Gawk or Nawk ! 

找了度娘,发现上面这句的意思是:NDK里面的awk.exe文件已经过期, Host 'awk' tool is outdated。

解决方案,最直接的办法是到NDK的根目录下android-ndk-r7\prebuilt\windows\bin,把这个过期的awk.exe删除掉,这样程序解析时找不到自带的awk就会去调用cygwin的默认awk文件解析。

 

编译成功之后,会直接在testandroid\proj.android\libs\armeabi这个目录底下生成so文件(libgame.so) ,如下图。

有部分win 7 win8的朋友,可能会遇到这样的报错:

cc1plus.exe: error: jni/hellocpp/main.cpp: Permission denied
/cygdrive/g/android-ndk-r7/build/core/build-binary.mk:241: recipe for target 'obj/local/armeabi/objs-debug/hellocpp_shared/hellocpp/main.o' failed
make: *** [obj/local/armeabi/objs-debug/hellocpp_shared/hellocpp/main.o] Error 1
make: Leaving directory '/cygdrive/d/BaiduYunDownload/cocos2d-2.0-x-2.0.4/helloAndroid/proj.android'

 这个是用户权限的问题。关于报错"cc1plus.exe: fatal error: jni/hellocpp/main.cpp: Permission denied“ 的解决方法,这里推荐参考帖子http://blog.csdn.net/msn465780/article/details/9168017

此外,如果用NDK r9版本编译的朋友,报错的内容和解决方法,可以参考我写这个帖子:http://blog.csdn.net/u013174689/article/details/18739125

 

6、接下来就是在eclipse里面导入android项目,并编译成apk文件。

(1)将刚编译完的工程导入到eclipse中,操作方法如下:

选File->New->project,如下图,点击Android->Android Project from Existing Code,确认next。


TM截图20130426235238.png

填写导入刚才生成的hellotest项目的Root Directory路径,

例如我的是E:\cocos2d-2.0-x-2.0.4\cocos2d-2.0-x-2.0.4\hellotest

点击按钮Refresh


(2)如果第一次操作的童鞋们刚加进去肯定是要报错的,因为还没有加库。

导入库的方法是跟刚刚的方法一样。

我们以同样的方法导入cocos2d-x文件夹里cocos2dx里面的platform里的android文件。
例如我的是E:\cocos2d-2.0-x-2.0.4\cocos2d-2.0-x-2.0.4\cocos2dx\platform\android
(3)点击项目名字,右键run as android application

目前模拟器可能会有些异常,所以必须用真机去调试。

把生成的apk文件复制到手机,安装后可以看到游戏界面。

 

参考资料

1、【cocos2d-x入门实战】环境配置、交叉编译及安卓项目的生成,http://www.apkbus.com/android-142396-1-1.html

2、关于awk.exe文件报错解决, http://blog.csdn.net/imyang2007/article/details/8143806

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值