cocos2d-x for Android安装和学习笔记(请用adt-bundle21.1或以上导入)
(20121108)注意:这篇文章已过时,最新版ADT 20.0.3支持右键把Android工程直接添加native特性(即Android工程和CDT Makefile工程合二为一),不需要做太多复杂的设置,而且完全兼容ndk-build命令行编译。当然,因为会执行完全编译,所以如果经常clean,又想加快编译速度,得另想方法。
(20130212)adt-bundle的导入方法文章最后
(20130314) adt-bundle 21.1貌似已修正.svn目录导致编译失败的bug
(TODO:内容未稳定)
一、安装笔记
1. 下载:
下载官方的源码包
http://code.google.com/p/cocos2d-x/downloads/list
2. 创建示例工程:
因为官方没有发布编译后的二进制文件,所以要自己编译。
下载的cocos2d-1.0.1-x-0.13.0-beta.zip压缩包里根目录有一个文件叫create-android-project.bat。(还有个.sh后缀的文件,它不能用cygwin运行)
如果直接运行的话可能会报错,说某个目录错误,需要用编辑器(我用的是notepad2)编辑,修改这几个变量:
_CYGBIN:cygwin的bin目录
_ANDROIDTOOLS:android sdk的tools目录
_NDKROOT:ndk的根目录
然后运行,根据提示输入包名、工程名和API级别。
最后会生成一个以工程名命名的目录,
3. 编译.so文件
生成的工程目录有三个子目录:
* android:特定于Android平台的工程文件
* Classes:跨平台的C++源文件和头文件
* Resources:公共的资源文件(跨平台)
在cygwin下cd进去(切换到android子目录中),然后执行
./build_native.sh
编译JNI代码。
编完后libs\armeabi下会出现一个1MB左右的libgame.so文件
obj下会生成一堆中间.o文件,应该是没用的。
4. 编译apk和安装到手机
我事先用bat配置好ant的环境变量:
- @set PATH="C:\WINDOWS"
- @set PATH="C:\WINDOWS\system32";%PATH%
- @set PATH="D:\java\apache-ant-1.8.1\bin";%PATH%
- @set JAVA_HOME="D:\java\jdk1.6.0_20"
- @set PATH="D:\java\jdk1.6.0_20\bin";%PATH%
- @set PATH="D:\java\android-sdk_r10-windows\android-sdk-windows\platform-tools";%PATH%
- @set PATH="D:\java\android-sdk_r10-windows\android-sdk-windows\tools";%PATH%
- @cd /D "D:\java\android-sdk_r10-windows\android-sdk-windows\work"
- @cmd
现在开始用ant编译Android工程(先切换到build.xml的目录中)
> ant debug
(也可以执行ant release,可输入ant查看命令行用法)
生成bin\cocostest-debug.apk
然后用91或adb装到手机上即可。
默认界面上只有一张图片,一个Hello World字符串,一个fps值和一个退出按钮。
整个过程不需要导入到Eclipse中
二、参考
1. 如何在macox下面配置集成ios和android游戏教程
http://www.cnblogs.com/andyque/archive/2012/02/23/2364163.html
2. cocos2d-x初探学习笔记(1)--HelloWorld
http://blog.csdn.net/bill_man/article/details/7202458
3. Cocos2D-X官网中文页面
-------------------------------
(2012/04/23更新)
三、独立工具链的编译(不编译依赖库)
(以下对于cocos2d-1.0.1-x-0.13.0-beta)
在(一)中最后会得到几个.a文件。如果不考虑那些库文件的编译,整个.so的编译过程是很简单的。
在ndk-build后面添加V=1的方法打开Makefile的执行输出,可以看到生成.so的关键命令是:
如果不考虑lua/cocos2dx_support下的.o文件,而且假设.a文件已经编译好,那么可以简化为以下Makefile(头文件目录进行了调整,而且因为我对ndk的工具链目录也作了调整,所以不需要添加--sysroot开关)
- CC := arm-linux-androideabi-gcc
- CPP := arm-linux-androideabi-g++
- LD := arm-linux-androideabi-ld
- STRIP := arm-linux-androideabi-strip
- RM := rm -rf
- CPPFLAGS := -g
- CPPFLAGS += -DANDROID -I../Classes -I../cocos2dx -I../cocos2dx/include -I../cocos2dx/platform
- LDFLAGS := -shared
- LIBS := -Wl,--whole-archive ../cocos2dx/lib/libcocos2dx.a ../cocos2dx/lib/png.a ../cocos2dx/lib/jpeg.a ../cocos2dx/lib/xml2.a -Wl,--no-whole-archive ../cocos2dx/lib/libgnustl_static.a -Wl,--no-undefined -Wl,-z,noexecstack -llog -lz -lGLESv1_CM -llog -lc -lm
- TARGET := libs/armeabi/libgame.so
- OBJS := jni/helloworld/main.o
- OBJS += ../Classes/AppDelegate.o
- OBJS += ../Classes/HelloWorldScene.o
- all : $(TARGET)
- $(TARGET) : $(OBJS)
- $(CC) $(LDFLAGS) $(OBJS) $(LIBS) -o $@
- $(STRIP) --strip-unneeded $(TARGET)
- %.o : %.cpp
- $(CPP) $(CPPFLAGS) -o $@ -c $<
- clean :
- $(RM) $(OBJS) $(TARGET)
可以看到,实际上需要编译的源文件只有三个:
Android/jni/helloworld/main.cpp
Classes/AppDelegate.cpp
Classes/HelloWorldScene.cpp
四、CDT配置
1. 修改CDT工程属性
假设
(1) 已编译好的所有.a文件:
libcocos2dx.a
png.a
jpeg.a
xml2.a
libgnustl_static.a
已经复制到
G:/weimingtom_tools/android-ndk-r5b/home/Administrator/cocos2d-x/cocos2dx/lib/
目录中。
(2) NDK目录在
C:/cygwin/home/Administrator/android-ndk-r7b-windows/android-ndk-r7b
(3) Android工程的libs\armeabi目录在子目录
android\libs\armeabi
(4) cocos2dx源码在
C:\cygwin\home\Administrator\android-ndk-r7b-windows\android-ndk-r7b\cocos2d
首先在C/C++ build->Configureation:中选择[All configurations],
然后设置以下内容(列表框支持直接粘贴)
(1) New:
C++ Project->Shared Library->Cross-Compile Project
(2) Prefix:
arm-linux-androideabi-
(3) Path:
C:\cygwin\home\Administrator\android-ndk-r7b-windows\android-ndk-r7b\toolchains\arm-linux-androideabi-4.4.3\prebuilt\windows\bin
(4) Text file encoding:
UTF-8
(5) Make:
C:\cygwin\home\Administrator\android-ndk-r7b-windows\android-ndk-r7b\prebuilt\windows\bin\make
(6) G++ Defined symbols:
ANDROID
(7) G++ Include path:
"C:/cygwin/home/Administrator/android-ndk-r7b-windows/android-ndk-r7b/platforms/android-8/arch-arm/usr/include"
"C:/cygwin/home/Administrator/android-ndk-r7b-windows/android-ndk-r7b/sources/cxx-stl/gnu-libstdc++/include"
"C:/cygwin/home/Administrator/android-ndk-r7b-windows/android-ndk-r7b/sources/cxx-stl/gnu-libstdc++/libs/armeabi/include"
"C:/cygwin/home/Administrator/android-ndk-r7b-windows/android-ndk-r7b/cocos2d/cocos2dx"
"C:/cygwin/home/Administrator/android-ndk-r7b-windows/android-ndk-r7b/cocos2d/cocos2dx/include"
"C:/cygwin/home/Administrator/android-ndk-r7b-windows/android-ndk-r7b/cocos2d/cocos2dx/platform"
${workspace_loc:/${ProjName}/Classes}
(8) G++ Lib:
log
z
GLESv1_CM
c
m
(9) G++ Lib path:
"C:/cygwin/home/Administrator/android-ndk-r7b-windows/android-ndk-r7b/platforms/android-8/arch-arm/usr/lib"
(10) -Wl,-soname=
libgame.so
(11) Artifact name:
game
(12) G++ linker linker flags
--sysroot="C:/cygwin/home/Administrator/android-ndk-r7b-windows/android-ndk-r7b/platforms/android-8/arch-arm"
(13) Expert settings:
Command line pattern:
${COMMAND} ${FLAGS} ${OUTPUT_FLAG} ${OUTPUT_PREFIX}${OUTPUT} -Wl,--whole-archive "G:/weimingtom_tools/android-ndk-r5b/home/Administrator/cocos2d-x/cocos2dx/lib/libcocos2dx.a" "G:/weimingtom_tools/android-ndk-r5b/home/Administrator/cocos2d-x/cocos2dx/lib/png.a" "G:/weimingtom_tools/android-ndk-r5b/home/Administrator/cocos2d-x/cocos2dx/lib/jpeg.a" "G:/weimingtom_tools/android-ndk-r5b/home/Administrator/cocos2d-x/cocos2dx/lib/xml2.a" -Wl,--no-whole-archive "G:/weimingtom_tools/android-ndk-r5b/home/Administrator/cocos2d-x/cocos2dx/lib/libgnustl_static.a" -Wl,--no-undefined -Wl,-z,noexecstack ${INPUTS}
(14)Build Steps->Post-build steps->Command:
arm-linux-androideabi-strip --strip-unneeded libgame.so && copy libgame.so ..\android\libs\armeabi
2. 如果修改了配置,错误提示仍然没有改变,可尝试:
工程->右键->Index->Rebuild
或
工程->右键->Refresh
直至错误完全消失
3. 编译libgame.so
工程->右键->Build Configurations->Set Active选择Debug还是Release
然后Clean Project, Build Project
4. 编译apk
> cd /d C:\Documents and Settings\Administrator\workspace_indigo_sr2\cocostest\android
> ant clean debug install
----------------------------------------
(20130212更新)
在adt-bundle-x86 r21.0.1上导入cocos2dx工程
(基于cocos2d-2.1beta3-x-2.1.1和android-ndk-r7b-windows,
假设已经创建好helloworld工程)
(工程创建方法是修改create-android-project.bat,然后执行它,和cocos2dx的旧版本的创建方法差不多)
1. 下载解压adt-bundle
https://developer.android.com/sdk/index.html
然后运行adt-bundle-windows-x86\eclipse\eclipse.exe
2. window->Preferences->Android->NDK填写安装NDK安装根目录,例如:
C:\cygwin\home\Administrator\android-ndk-r7b-windows\android-ndk-r7b
3. 右键->Import...->Android->Existing Android Code Into Workspace
4. 右键->Android Tools->Add Native Support...
5. 右键->Properties->C/C++ Build->Environment
假设cocos2dx安装根目录为C:/cygwin/home/Administrator/cocos2d-2.1beta3-x-2.1.1
添加环境变量NDK_MODULE_PATH为
C:/cygwin/home/Administrator/cocos2d-2.1beta3-x-2.1.1;C:/cygwin/home/Administrator/cocos2d-2.1beta3-x-2.1.1/cocos2dx/platform/third_party/android/prebuilt
(用分号隔开)
修改环境变量PATH为空字符串
6. 主菜单->Project->Clean...
7. 主菜单->Project->Build All...
(如果出现错误,可能需要:项目右键->Index->Rebuild)
8. 检查是否生成libs/armeabi/libgame.so
注意事项:
1. 部分Java代码在
cocos2dx安装根目录\cocos2dx\platform\android\java目录下
如果编译器支持Android库工程有问题(例如Windows旧版本的adt),可直接把java源文件复制到工程中。
2. 如果执行Build All时出现
/usr/bin/sh: -c: line 1: syntax error: unexpected end of file
make: *** [libs/armeabi/libgame.so] Error 1
make: *** Deleting file `libs/armeabi/libgame.so'
可能是由于ndk-build编译时环境变量不同造成
请环境变量PATH为空字符串(见上面第5步)
3. 如果用命令行,相当于在proj.android目录下执行:
set NDK_MODULE_PATH=C:/cygwin/home/Administrator/cocos2d-2.1beta3-x-2.1.1;C:/cygwin/home/Administrator/cocos2d-2.1beta3-x-2.1.1/cocos2dx/platform/third_party/android/prebuilt
C:\cygwin\home\Administrator\android-ndk-r7b-windows\android-ndk-r7b\ndk-build.cmd
(可以写一个bat文件放在proj.android目录下执行)
(20130313补充)
4. Resources下的图片需复制到proj.android\assets下,否则会弹对话框报错
5. 如果不考虑跨平台,可以把Classes目录移动到proj.android\Classes
然后把Android.mk中的../../Classes改为../Classes
项目右键->Properties->C/C++ General->Path and Symbols->Source Location添加Classes目录
以方便用adt-bundle修改源代码
6. 出现错误:Errors running builder 'Android Pre Compiler' on project…无法编译和运行工程
参考:http://stackoverflow.com/questions/14455018/eclipse-android-errors-running-builder-android-pre-compiler-on-project
Open properties of project in Eclipse then Resources -> Resource filters.
Click the "Add..." button -> Check "Exclude all", "Files and folders", "All children". In the text entry box input ".svn" (without quotes).
Restart Eclipse.
原因是旧版本的adt-bundle不支持.svn文件的忽略
解决办法是:
右键属性->Resources -> Resource filters
点击add按钮
勾选"Exclude all", "Files and folders", "All children"
文本框中填入.svn
然后重启Eclipse,重新编译
(或更新至最新版本的adt-bundle)
7. 新版本cocos2dx貌似只支持gles 2.0的设备,所以模拟器似乎不能运行(反正模拟器跑得很慢)。
(20130325)
windows上游戏demo例子(基于旧版本):
https://code.google.com/p/android-app-examples/
(TODO:待补充)