跨平台移植
cocos2d-x游戏从win32平台移植Android平台
1. Android平台搭建
操作系统:Win7 32位
测试手机:联想A880(android 4.3)
需要软件如下:
1.python2.7.5
python环境变量的增加
1.点击开始,右键单击计算机,选择属性
2.选择高级系统设置
3.在高级系统环境变量里面设置路径path,如果存在则在路面最后面加;+你的python.exe的路径即可
使用python脚本创建cocos2dx项目
点击开始,输入cmd回车。
首先用cd命令进入你的cocos2dx项目下\cocos2d-x-2.1.5\cocos2d-x-2.1.5\tools\project-creator目录。
输入pythoncreate_project.py -project PROJECT_NAME -package PACKAGE_NAME -languagePROGRAMING_LANGUAGE命令回车即可,其中PROJECT_NAME的项目名称,PACKAGE_NAME是Android项目包名,PROGRAMING_LANGUAGE是语言(C++一般填写cpp即可)。
查看、运行创建的项目
项目存在相对路径cocos2d-x-2.1.5\cocos2d-x-2.1.5\projects下。选择win32项目,点击navalbattle.sln即可
F5运行项目,成功。界面如下图。
2.cocos2d-x-2.2.3版本 安装简单,不再啰嗦
3.jdk-8u5-windows-i586
(一共需要新建三个环境变量:
1.变量名:JAVA_HOME 变量值:C:\Program Files (x86)\Java\jdk1.6.0_10(变量值不同的电脑不同,需要看你自己jdk的安装目录就能够找到,也就是把你自己的jdk路径复制下来就可以了。)
2.变量名:Path 变量值:%JAVA_HOME%\bin;%JAVA_HOME%\jre\bin;(这个可以直接复制到变量值中,这个是通用的。)
3.变量名:Calsspath 变量值:%JAVA_HOME%\lib;(这个一样也可以直接复制到变量值中,不解释,你懂的。)
三个环境变量增加好了就可以了,接下来你就可以打开运行窗口运行一个java程序测试一下,如果不行的话可能就是这三个环境变量哪里写错了。这里我就不演示了。)
方法/步骤
1. 安装JDK 选择安装目录 安装过程中会出现两次安装提示 。第一次是安装 jdk ,第二次是安装 jre 。建议两个都安装在同一个java文件夹中的不同文件夹中。(不能都安装在java文件夹的根目录下,jdk和jre安装在同一文件夹会出错)
如下图所示
2. 1:安装jdk 随意选择目录 只需把默认安装目录 \java 之前的目录修改即可
2:安装jre→更改→ \java之前目录和安装 jdk 目录相同即可
注:若无安装目录要求,可全默认设置。无需做任何修改,两次均直接点下一步。
3. 安装完JDK后配置环境变量 计算机→属性→高级系统设置→高级→环境变量
4. 系统变量→新建 JAVA_HOME 变量。
变量值填写jdk的安装目录(本人是 E:\Java\jdk1.7.0)
5. 系统变量→寻找 Path 变量→编辑
在变量值最后输入%JAVA_HOME%\bin;%JAVA_HOME%\jre\bin;
(注意原来Path的变量值末尾有没有;号,如果没有,先输入;号再输入上面的代码)
6. 系统变量→新建 CLASSPATH 变量
变量值填写 .;%JAVA_HOME%\lib;%JAVA_HOME%\lib\tools.jar(注意最前面有一点)
系统变量配置完毕
7. 7
4.2013-10-24_adt-bundle-windows-x86-20130917(含有SDK和eclipse)
新建环境变量:ANDROID_SDK 值为:G:\AndroidSDK\platforms;G:\Android SDK\tools(这个是SDK存放的位置)
在系统PATH环境变量种加入:%ANDROID_SDK% 看好了,看下图,是系统变量
5.android-ndk-r9d(不需要cygwin)
2.android平台工程创建
1、android SDK+NDK安装
1)安装java jdk(如果已经安装了,可以不用此步骤)
进入:http://www.oracle.com/technetwork/java/javase/downloads/index.html 或者直接点击下载。如下图
选择JDK DOWNLOAD(android 开发无需JRE)
如果是32位windows 7选择Windows x86 ,64位windows 7选择Windows x64。
安装后,配置环境变量:
新建环境变量:JAVA_HOME值为:D:\Program Files\Java\jdk1.7.0
新建环境变量:CLASSPATH 值为:.;%JAVA_HOME%\lib;(注意:点号表示当前目录,不能省略)
在系统变量Path的值的前面加入以下内容:%JAVA_HOME%\bin;(注意:这里的分号不能省略)到这里,JDK安装完毕。
单击“开始”—>“运行”—>输入:cmd命令,在CMD窗口中输入:java -version
出现如下界面,就表示安装成功:
2)下载eclipse
进入以下页面:
http://www.eclipse.org/downloads/packages/
选择windows 32-bit 下载,解压后直接打开即可。
3)安装android sdk和NDK
进入以下页面http://developer.android.com/sdk/index.html
或直接复制此地址下载:http://dl.google.com/android/installer_r18-windows.exe
打开installer_r18-windows.exe
安装时会检查jdk安装情况,如果没安装成功会失败的。
然后运行SDKManager.exe 进行更新sdk(建议根据需要下载对应版本的sdk)。我们用的是r9d版本。
点解installpackages。完成后,为了方便,也配置下环境变量
新建环境变量:ANDROID_SDK值为:G:\Android SDK\platforms;G:\Android SDK\tools(这个是SDK存放的位置)
在系统PATH环境变量种加入:%ANDROID_SDK%
单击“开始”—>“运行”—>输入:cmd命令,在CMD窗口中输入:adb -h
进入http://developer.android.com/tools/sdk/ndk/index.html 或点击直接下载
下载解压到E:\android-ndk-r8
AndroidNDK包含build、docs、samples、sources、GNUmakefile、ndk-build、ndk-gdb及readme等内容。
2、Cygwin安装(ndk r8后不需要此步了)
由于NDK开发大都涉及到C/C++在GCC环境下编译、运行,所以在Windows环境下,需要模拟Linux模拟编译环境,下载地址:
下载后是个setup.exe文件,使用过程如下:
第一步:运行setup程序,第一步图略,直接点击Next进入下一步。
第二步:选择安装方式,第一次可以采用Direct Connection在线下载安装,如有现成的离线包,可以选择离线安装(Install from Local Directory)。
第三步:选择安装目录,比如C:\Cygwin,注意此目录是指Cygwin最终的安装目录,不是下载文件暂存目录。
第四步:设置本地包暂存路径
暂存目录默认是放到setup.exe的同级目录下,下载后名字类似ftp%3a%2f%2fcygwin.mirrors.pair.com%2f这样格式。
第五步:设置网络连接方式
第六步:选择下载站点地址
起初尝试几个看哪个速度快就用哪个地址(如果感觉不快就点取消,再次来过)。
第七步:等待加载安装项载入,选择安装项
我们编译NDK,在默认设置下,只需选择Devel(点击列表中Devel,将后面的Default改为Install,图中箭头所示),其它均为默认状态。(其实NDK需要的不多,主要autoconf2.1、automake1.10、binutils、gcc-core、gcc- , g++、gcc4-core、gcc4-g++、gdb、pcre、pcre-devel、gawk、make)
第八步:等待下载完成
下载完成时间决定于你选择的安装包数量及网络连接速度,比如按照本文默认的选择方式,可能需要2-3个小时(视网速而定),下载后压缩包约1.2G,下载完成后会自动安装到上文设置的安装目录。
提醒:第一次下载完成后,最好把下载的包目录做个备份,下次安装同样的环境可以直接使用离线安装方式(第二步中选择本地安装)。
运行cygwin,在弹出的命令行窗口输入:cygcheck -c cygwin命令,会打印出当前cygwin的版本和运行状态,如果status是ok的话,则cygwin运行正常。
然后依次输入gcc –v,g++ --version,make –version,gdb –version进行测试,(注意空格和-)如果都打印出版本信息和一些描述信息,这说明cygwin安装成功了。
3、安装ADT和配置Cygwin
安装android 开发插件
(1)打开Eclipse, 在菜单栏上选择help->Install New SoftWare 出现如下界面:
点击 Add按钮,出现如下界面
输入网址: https://dl-ssl.google.com/android/eclipse/ (如果出错,请将https改成http)
名称: Android (这里可以自定义)
点击OK,将出现如下界面
全部选中。
点击 Next按钮,出现如下界面:
点击 Next 按钮,出现如下界面 :
选择 I accept theterms of the license agreements 点击Next,进入安装插件界面
安装完成后,出现如下界面
点击Yes按钮,重启Eclipse。
点击菜单window->preferences,进入如下界面:
选择你的android SDK解压后的目录(ADT 18 默认会扫描你的电脑,找到并配置好SDK位置)。
如果没安装好SDK的,也可以在eclipse中选择菜单 window->Android sdk and avdmanager 出现如下界面:
也可以选择你需要的版本的sdk。
新建AVD(androidvitural device)和上面一样,进入android sdk and avd manager,选中Vitural Devices 在点击New按钮
点击New按钮后,进入如下界面:
名称可以随便取,target选择你需要的SDK版本,SD卡大小自定义,点击 Create AVD便成功创建。
配置cygwin
在命令行中进入cygwin目录,并执行cygwin.bat,如果你不是用Administrator账号登录的系统,那么会在cygwin\home\文件夹中生成一个以你的登录名命名的新的文件夹。
修改新生成文件夹中的“.bash_profile”文件,用UE或editplus等文本编辑器打开,在最后增加:(e/android-ndk-r8-windows/android-ndk-r8是安装ndk的路径)
NDK_ROOT=/cygdrive/e/android-ndk-r8-windows/android-ndk-r8
exportNDK_ROOT
然后保存关闭。
3. Windows平台开发步骤:
开发语言:C++
环境: Vs2012或Vs2013.最好搭配Vs2012+ win7; Vs2013+win8
vc助手插件VA_X_Setup1827
cocos2d-x-2.2.3版本
Vs2012或Vs2013,安装比较简单,不再啰嗦。新建cocos2d工程参照,python命令方式进行。
如果在vs的debug下调试出现以下错误:
LINK1123: failure during conversion to COFF: fileinvalid or corrupt
解决办法如下:
VS2010,每运行一个简单的程序总是报error LINK1123: failure during conversion to COFF: file invalid or corrupt的错误。
解决方法:
这个错误是因为采用incremental linking(增量式链接)导致的,可以通过禁止工程中incrementallinking的选项避免这个问题。具体操作:
Project(项目)->Properties(属性)->Linker(连接器)->Gerneral(常规)->EnableIncremental Linking(启动增量链接),把Yes (/INCREMENTAL)改为No (/INCREMENTAL:NO)即可。
上述问题只有在debug版本下才会出现的,是因为release版本会默认关闭增量连接而debug版本默认是启动增量链接的。
incremental linking 是为了节省编译所用时间,加快编译速度。至于为什么会有问题,应该是VS工程的一个BUG。
特别注意:
单独运行debug里边的exe文件,是不能运行的,需要把Resources文件夹里边的资源内容拷贝到Debug.win32目录之下,之后再单独运行debug里边的exe文件就可运行。
1) VS2012 Debug编译D:\programs\cocos2d-x-2.2.2\cocos2d-x-2.2.2目录下的cocos2d-win32.vc2012工程;
2) cocos2d库文件全部编译完成后,进入D:\programs\cocos2d-x-2.2.2\cocos2d-x-2.2.2\tools\project-creator目录下,命令行执行 python create_project.py –projectPlay –package com.xyz.play –language cpp创建工程;
例如:
pythoncreate_project.py -project lei -package com.hck.lei -language cpp
工程名:lei
(cd..
e:
cd cocos2d-x-2.2.3
cd tools
cd project-creator)
3) 在目录D:\programs\cocos2d-x-2.2.2\cocos2d-x-2.2.2\projects下找到刚刚创建的工程Play,进入proj.win32目录,用VS2012编译Play.sln;
4) 编译完成后,就可以在windows平台进行游戏的开发调试了,开发过程中,资源文件放到工程的Resources目录下,代码文件放到Classes目录下;此步在后边搭建Android平台时详细说明。
5) 游戏开发测试完成后,就可以进行Android平台的移植了。
4. Android DNK编译环境设置(配合5一起完成移植,内容有交叉,注意区分)
一是:用python创建Android下的工程play:
D:\programs\cocos2d-x-2.2.2\cocos2d-x-2.2.2\tools\project-creator目录下,命令行执行pythoncreate_project.py –projectPlay –package com.xyz.play –language cpp创建工程;
二是:在Android中导入play工程:
File--àNew---àProject-àAndroidProject from Existing Code
在接下的路径中根据实际情况输入:其中qin为已经建立的android工程名,注意最后的文件夹落在qin/proj.android
之后按下列方法配置环境:
步骤一、配置AndroidDNK编译环境 此步可忽略。
运行eclipse,配置一下ndk路径就可以了 window->Preferences,如下图
环境搭建好了,下面写个测试程序验证一下
简单创意一个android工程,相当于helloworld,创建好后鼠标右键工程名字Android Tools->Add Native Support...这时你会发现工程多了一个jni目录
测试demo比较简单,实现android端与C++的相互调用
步骤二、资源移植
1.先将D:\cocos2d-x-2.2\cocos2d-x-2.2\cocos2dx\platform\android\java\src下的org目录拷贝到D:\cocos2d-x-2.2\cocos2d-x-2.2\projects\Helloworld\proj.android\src下
2.将D:\cocos2d-x-2.2\cocos2d-x-2.2\projects\Helloworld\Classes下的全部C++文件拷贝到D:\cocos2d-x-2.2\cocos2d-x-2.2\projects\Helloworld\proj.android\jni\hellocpp
3.由于第二步转移了C++文件的路径,因此在D:\cocos2d-x-2.2\cocos2d-x-2.2\projects\Helloworld\proj.android\jni下的Android.mk 文件里也要指明这些C++文件的路径,要修改只有如下的项LOCAL_SRC_FILES
LOCAL_SRC_FILES :=hellocpp/main.cpp \ hellocpp/AppDelegate.cpp \ hellocpp/HelloWorldScene.cpp 即将(AppDelegate.cpp 和HelloWorldScene.cpp)与main.cpp的相对路径改了。此步重点是把要添加的cpp文件手工加入,后边有实际说明。
4.将路径D:\cocos2d-x-2.2\cocos2d-x-2.2\projects\Helloworld\proj.android下的Android工程导入Ecllipse中 再将路径 D:\cocos2d-x-2.2\cocos2d-x-2.2\projects\Helloworld\Resources下的资源全部拷贝到Android工程的assets目录下
步骤三、设置编译方式
1.右键移植的Android工程,选择properties,再选择Builders->New->program 在mian页面填入NDK编译路径和本工程路径,如下:(注意第二项Working Directory 要对应自己的Android工程名称) D:\cocos2d-x-2.2\cocos2d-x-2.2\android-ndk-r9\android-ndk-r9\ndk-build.cmd${workspace_loc:/HelloCpp}
2.在Environment界面新建环境变量: 内容如下: NDK_MODULE_PATHD:\cocos2d-x-2.2\cocos2d-x-2.2;D:\cocos2d-x-2.2\cocos2d-x-2.2\cocos2dx\platform\third_party\android\prebuilt
步骤四、编译运行成功 (耗时会比较长,一般约20分钟)
步骤五、分辨率
在AppDelegate.cpp的 boolAppDelegate::applicationDidFinishLaunching() 方法里,加上
CCEGLView::sharedOpenGLView()->setDesignResolutionSize(576,324,kResolutionNoBorder);即可解决分辨率适配问题。
其中,576,324 是在win32设计游戏时采用的宽度和高度,大家改为自己所设置的宽高即可。kResolutionNoBorder是指在屏幕拉伸时采用的其中一种策略,保证拉伸后无边界,但是设计时界面的边缘部分可能在最后被遮盖。通过 "go to definition"操作找到如下的定义。以下即是全部的适配策略了。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
enumResolutionPolicy { // The entire application is visible in the specified area without trying to preserve the original aspect ratio. // Distortion can occur, and the application may appear stretched or compressed. kResolutionExactFit, // The entire application fills the specified area, without distortion but possibly with some cropping, // while maintaining the original aspect ratio of the application. kResolutionNoBorder, // The entire application is visible in the specified area without distortion while maintaining the original // aspect ratio of the application. Borders can appear on two sides of the application. kResolutionShowAll,
kResolutionUnKnown, }; |
5. Android平台移植步骤(配合4一起完成移植,内容有交叉,注意区分)
1) 配置ADT,打卡菜单Window->Preferences->Android->NDK,配置NDK Location:D:/programs/android-ndk-r9c;
2) Import Existing Android codeintoworkspace, 选择D:\programs\cocos2d-x-2.2.2\cocos2d-x-2.2.2\cocos2dx\platform\android\java目录,导入工程libcocos2dx(不要选copy projects intoworkspace);
3) Import刚刚创建的工程Play,目录在D:\programs\cocos2d-x-2.2.2\cocos2d-x-2.2.2\projects\Play\proj.android(不要选copy projects into workspace)该工程默认引用libcocos2dx库,可以在Properties->Android里看到,如果选择了copy projectsinto workspace,路径改变后就会破坏cocos2dx所创建项目原本的依赖关系;
如果通过python create_project.py -project lei -package com.hck.lei -languagecpp命令创建Adroid工程,以上2)和3)就可忽略
4) 设置工程属性,选择Propertices->C/C++ Build,Build command改为:D:/programs/android-ndk-r9c/ndk-build.cmd;
5) 选择Propertices->C/C++Build->Environment,添加Variable:NDK_MODULE_PATH,值为D:/Programs/cocos2d-x-2.2.2/cocos2d-x-2.2.2;D:/Programs/cocos2d-x-2.2.2/cocos2d-x-2.2.2/cocos2dx/platform/third_party/android/prebuilt;
6) 修改jni/Android.mk,在$(call import-module,cocos2dx)之上添加红色的两行
$(callimport-add-path,D:/Programs/cocos2d-x-2.2.2/cocos2d-x-2.2.2)
$(callimport-add-path,D:/Programs/cocos2d-x-2.2.2/cocos2d-x-2.2.2/cocos2dx/platform/third_party/android/prebuilt)
$(callimport-module,cocos2dx)
7) 修改jni/Android.mk,在LOCAL_SRC_FILES中添加自己编写的源码文件;
LOCAL_SRC_FILES := hellocpp/main.cpp \
../../Classes/AppDelegate.cpp \
../../Classes/HelloWorldScene.cpp \
../../Classes/SecondScene.cpp
LOCAL_C_INCLUDES :=$(LOCAL_PATH)/../../Classes
上边倒数第二句红色代码:../../Classes/SecondScene.cpp是自己手工添加的,要根据自己编写的程序实际情况添加。
8) 修改jni/Application.mk,最后面添加一行NDK_MODULE_PATH:=D:/Programs/cocos2d-x-2.2.2/cocos2d-x-2.2.2;D:/Programs/cocos2d-x-2.2.2/cocos2d-x-2.2.2/cocos2dx/platform/third_party/android/prebuilt
9) 把Resources里的资源文件全部复制到android工程的assets目录,没有assets目录,就创建一个;
10) ADT右上角Open Perspective选择C/C++,工具栏点Build,等待编译完成,时间比较长(15分钟左右);
11) 编译完成后Console提示
[armeabi]Install :libcocos2dcpp.so =>libs/armeabi/libcocos2dcpp.so
****Build Finished****
12) 连接Android设备,运行Play工程Run As AndroidApplication,等待安装完毕,Android平台移植完成。
总之,以上配置注意各路径必须指向正确,另Adroid.mk 和 Aplication.mk两文件要做修改:其中Aplication.mk文件最后一句红色代码也是NDK_MODULE_PATH环境变量设置的一种方式。
Adroid.mk文件如下:其中红色代码是手工添加的,注意各自的路径。
LOCAL_PATH :=$(call my-dir)
include$(CLEAR_VARS)
LOCAL_MODULE := cocos2dcpp_shared
LOCAL_MODULE_FILENAME := libcocos2dcpp
LOCAL_SRC_FILES := hellocpp/main.cpp \
../../Classes/AppDelegate.cpp \
../../Classes/HelloWorldScene.cpp \
../../Classes/SecondScene.cpp
LOCAL_C_INCLUDES := $(LOCAL_PATH)/../../Classes
LOCAL_WHOLE_STATIC_LIBRARIES += cocos2dx_static
LOCAL_WHOLE_STATIC_LIBRARIES += cocosdenshion_static
LOCAL_WHOLE_STATIC_LIBRARIES += box2d_static
LOCAL_WHOLE_STATIC_LIBRARIES += chipmunk_static
LOCAL_WHOLE_STATIC_LIBRARIES += cocos_extension_static
include$(BUILD_SHARED_LIBRARY)
$(call import-add-path,e:/cocos2d-x-2.2.3)
$(callimport-add-path,e:/cocos2d-x-2.2.3/cocos2dx/platform/third_party/android/prebuilt)
$(call import-module,cocos2dx)
$(callimport-module,cocos2dx/platform/third_party/android/prebuilt/libcurl)
$(callimport-module,CocosDenshion/android)
$(call import-module,extensions)
$(call import-module,external/Box2D)
$(callimport-module,external/chipmunk)
Aplication.mk文件如下:其中红色代码是手工添加的,注意各自的路径。
APP_STL :=gnustl_static
APP_CPPFLAGS := -frtti -DCC_ENABLE_CHIPMUNK_INTEGRATION=1 -DCOCOS2D_DEBUG=1
NDK_MODULE_PATH :=e:/cocos2d-x-2.2.3;e:/cocos2d-x-2.2.3/cocos2dx/platform/third_party/android/prebuilt
最后一句红色代码也是NDK_MODULE_PATH环境变量设置的另一种方法。
附:
Error处理:Conversion to Dalvik formatfailed: Unable to execute dex: java.nio.BufferOverflowException.
对于这个问题,凡是经过以下方法处理的都能够正常进行编译和运行。
1、找到你的项目
2、点击右键
3、打开Properties属性项
4、选中左边Java Build Path项,并在该选项中打开Libraries选项卡,如上图中,将Android Dependencies项和Android PrivateLibraries这两项Remove掉。
5、Cleanup该项目
6、重新编译运行。
至此就可用C++在windows平台开发游戏后,再移植到Android平台,或移植到其他平台。
最终apk程序手机上运行: