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,运行脚本文件,脚本需要你填写的信息有。
![](https://img-my.csdn.net/uploads/201211/01/1351740236_4745.png)
鼠标拉到最上面,查看到最低可兼容的安卓版本号对应的id是7,
点击打开新建的安卓项目的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的朋友,可能会遇到这样的报错:
/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。
填写导入刚才生成的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