zoukankan      html  css  js  c++  java
  • android cocos2d-x for Android安装和学习笔记(请用adt-bundle21.1或以上导入)

    引用:http://weimingtom.iteye.com/blog/1483566

    (20121108)注意:这篇文章用cdt编译ndk工程的内容已过时(现在可以用adt-bundle,避免配置繁琐的参数),最新版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代码。

    编完后libsarmeabi下会出现一个1MB左右的libgame.so文件

    obj下会生成一堆中间.o文件,应该是没用的。

    4. 编译apk和安装到手机

    我事先用bat配置好ant的环境变量:

    Bat代码  收藏代码
    1. @set PATH="C:WINDOWS"  
    2. @set PATH="C:WINDOWSsystem32";%PATH%  
    3. @set PATH="D:javaapache-ant-1.8.1in";%PATH%  
    4.   
    5. @set JAVA_HOME="D:javajdk1.6.0_20"  
    6. @set PATH="D:javajdk1.6.0_20in";%PATH%  
    7.   
    8. @set PATH="D:javaandroid-sdk_r10-windowsandroid-sdk-windowsplatform-tools";%PATH%  
    9. @set PATH="D:javaandroid-sdk_r10-windowsandroid-sdk-windows ools";%PATH%  
    10. @cd /D "D:javaandroid-sdk_r10-windowsandroid-sdk-windowswork"  
    11. @cmd  

    现在开始用ant编译Android工程(先切换到build.xml的目录中)

    > ant debug

    (也可以执行ant release,可输入ant查看命令行用法)

    生成bincocostest-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官网中文页面

    http://cn.cocos2d-x.org/

    -------------------------------

    (2012/04/23更新)

    三、独立工具链的编译(不编译依赖库)

    (以下对于cocos2d-1.0.1-x-0.13.0-beta)

    在(一)中最后会得到几个.a文件。如果不考虑那些库文件的编译,整个.so的编译过程是很简单的。

    在ndk-build后面添加V=1的方法打开Makefile的执行输出,可以看到生成.so的关键命令是:

     写道
    arm-linux-androideabi-g++ -Wl,-soname,libgame.so -shared --sysroot=C:/cygwin/home/Administrator/android-ndk-r7b-windows/android-ndk-r7b/platforms/android-8/arch-arm ./obj/local/armeabi/objs/game_shared/helloworld/main.o ./obj/local/armeabi/objs/game_shared/__/__/Classes/AppDelegate.o ./obj/local/armeabi/objs/game_shared/__/__/Classes/HelloWorldScene.o ./obj/local/armeabi/objs/game_shared/__/__/__/lua/cocos2dx_support/CCLuaEngine.o ./obj/local/armeabi/objs/game_shared/__/__/__/lua/cocos2dx_support/Cocos2dxLuaLoader.o ./obj/local/armeabi/objs/game_shared/__/__/__/lua/cocos2dx_support/LuaCocos2d.o ./obj/local/armeabi/objs/game_shared/__/__/__/lua/cocos2dx_support/tolua_fix.o -Wl,--whole-archive ./obj/local/armeabi/libcocos2dx.a ./obj/local/armeabi/libcocosdenshion.a ./obj/local/armeabi/libbox2d.a ./obj/local/armeabi/liblua.a ./obj/local/armeabi/png.a ./obj/local/armeabi/jpeg.a ./obj/local/armeabi/xml2.a -Wl,--no-whole-archive ./obj/local/armeabi/libgnustl_static.a C:/cygwin/home/Administrator/android-ndk-r7b-windows/android-ndk-r7b/toolchains/arm-linux-androideabi-4.4.3/prebuilt/windows/bin/../lib/gcc/arm-linux-androideabi/4.4.3/libgcc.a -Wl,--no-undefined -Wl,-z,noexecstack -LC:/cygwin/home/Administrator/android-ndk-r7b-windows/android-ndk-r7b/platforms/android-8/arch-arm/usr/lib -llog -lz -lGLESv1_CM -llog -lc -lm -o obj/local/armeabi/libgame.so

    如果不考虑lua/cocos2dx_support下的.o文件,而且假设.a文件已经编译好,那么可以简化为以下Makefile(头文件目录进行了调整,而且因为我对ndk的工具链目录也作了调整,所以不需要添加--sysroot开关)

    Makefile代码  收藏代码
    1. CC := arm-linux-androideabi-gcc  
    2. CPP := arm-linux-androideabi-g++  
    3. LD := arm-linux-androideabi-ld  
    4. STRIP := arm-linux-androideabi-strip  
    5. RM := rm -rf  
    6.   
    7. CPPFLAGS := -g  
    8. CPPFLAGS += -DANDROID -I../Classes -I../cocos2dx -I../cocos2dx/include -I../cocos2dx/platform  
    9. LDFLAGS := -shared  
    10. 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  
    11.   
    12. TARGET := libs/armeabi/libgame.so  
    13.   
    14. OBJS := jni/helloworld/main.o   
    15. OBJS += ../Classes/AppDelegate.o   
    16. OBJS += ../Classes/HelloWorldScene.o  
    17.   
    18. all : $(TARGET)  
    19.   
    20. $(TARGET) : $(OBJS)  
    21.     $(CC) $(LDFLAGS) $(OBJS) $(LIBS) -o $@  
    22.     $(STRIP) --strip-unneeded $(TARGET)   
    23.   
    24. %.o : %.cpp  
    25.     $(CPP) $(CPPFLAGS) -o $@ -c $<  
    26.       
    27. clean :  
    28.     $(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工程的libsarmeabi目录在子目录

    androidlibsarmeabi

    (4) cocos2dx源码在

    C:cygwinhomeAdministratorandroid-ndk-r7b-windowsandroid-ndk-r7bcocos2d

     

    首先在C/C++ build->Configureation:中选择[All configurations],

    然后设置以下内容(列表框支持直接粘贴)

    (1) New:

    C++ Project->Shared Library->Cross-Compile Project

    (2) Prefix:

    arm-linux-androideabi-

    (3) Path:

    C:cygwinhomeAdministratorandroid-ndk-r7b-windowsandroid-ndk-r7b oolchainsarm-linux-androideabi-4.4.3prebuiltwindowsin

    (4) Text file encoding:

    UTF-8

    (5) Make:

    C:cygwinhomeAdministratorandroid-ndk-r7b-windowsandroid-ndk-r7bprebuiltwindowsinmake

    (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 ..androidlibsarmeabi

    2. 如果修改了配置,错误提示仍然没有改变,可尝试:

    工程->右键->Index->Rebuild

    工程->右键->Refresh

    直至错误完全消失

    3. 编译libgame.so

    工程->右键->Build Configurations->Set Active选择Debug还是Release

    然后Clean Project, Build Project

    4. 编译apk

    > cd /d C:Documents and SettingsAdministratorworkspace_indigo_sr2cocostestandroid

    > ant clean debug install

     
     
    我喜欢CDT的原因是它支持方法提示、错误警告跳转和定义跳转,但调试功能没有Qt Creator强。如图所示:
     


     
     
     



     ----------------------------------------

     (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-x86eclipseeclipse.exe

    2. window->Preferences->Android->NDK填写安装NDK安装根目录,例如:

    C:cygwinhomeAdministratorandroid-ndk-r7b-windowsandroid-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安装根目录cocos2dxplatformandroidjava目录下

    如果编译器支持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:cygwinhomeAdministratorandroid-ndk-r7b-windowsandroid-ndk-r7b dk-build.cmd 

    (可以写一个bat文件放在proj.android目录下执行)

     (20130313补充)

    4. Resources下的图片需复制到proj.androidassets下,否则会弹对话框报错

    5. 如果不考虑跨平台,可以把Classes目录移动到proj.androidClasses

    然后把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/

    -------------------------------------------------------

    (以下内容未实践验证,仅记录备忘)

    (20130402)

    1. jni目录中二级目录的Android.mk配置:(参考自https://github.com/eric-h/ObjLoader)

    * 顶级目录的Android.mk:

    LOCAL_PATH := $(call my-dir)

    include $(call all-subdir-makefiles)

    * 次级目录的Android.mk:(最后一行的include,对于jni入口用BUILD_SHARED_LIBRARY,对于库用BUILD_STATIC_LIBRARY)

    LOCAL_PATH:= $(call my-dir)

    include $(CLEAR_VARS)

    ...(变量赋值,以下是按顺序排列的设置指定)

    include $(BUILD_SHARED_LIBRARY)

    #include $(BUILD_STATIC_LIBRARY)

    * 修改LOCAL_PATH(不推荐,建议不要使用,放在include $(CLEAR_VARS)前的第一行)

    LOCAL_PATH := $(realpath $(call my-dir)/..)

    * 非标准的指定静态库(Android.mk所在目录与jni入口的Android.mk不平行。放在所有编译变量的赋值前。不建议,因为include的mk文件的内容不是以LOCAL_PATH := $(call my-dir)开头)

    include $(ENGINEDIR)/src/zlib/Android.mk

    * 指定输出文件名:

    LOCAL_MODULE := libapp

    LOCAL_MODULE_FILENAME:= libapp(此项非必须)

    * 指定编译用文件(可以是cpp或c文件)和编译参数:

    LOCAL_C_INCLUDES := $(LOCAL_PATH)/../(多用于include $(BUILD_SHARED_LIBRARY)所在的Android.mk)

    LOCAL_CFLAGS := -Werror -Wall -O4(此项非必须)

    LOCAL_SRC_FILES := app.cpp 

    * 条件编译参数:

    ifeq ($(TARGET_ARCH_ABI),x86)

    LOCAL_CFLAGS += -fno-stack-protector 

    endif

    * 指定静态库:(多用于include $(BUILD_SHARED_LIBRARY)所在的Android.mk)

    LOCAL_STATIC_LIBRARIES := libobj libzip libpng

    需要注意次序,被依赖的库放在最后,例如A依赖于B,那么LOCAL_STATIC_LIBRARIES :=  A  B)

    * 指定动态库:(一般放在所有变量赋值的最后)

    LOCAL_LDLIBS := -lGLESv1_CM -ldl -llog -lz(此项非必须)

    2. jni目录中Application.mk配置:

    * 全局的编译参数:

    APP_STL := gnustl_static(多数情况用stlport_static)

    APP_CPPFLAGS := -frtti -DCOCOS2D_DEBUG=1

    * 打开vfp编译开关-march=armv6 -mcpu=generic-armv6 -mfloat-abi=softfp

    (见http://stackoverflow.com/questions/13870691/android-ndk-armv6-vfp-devices-wrong-calculations-nan-denormal-numbers-vfp)

    或用github搜索-mfloat-abi=softfp(在Makefile分类中的Application.mk里)

    * 交叉编译的目标机器类型和Android版本号(参考自https://code.google.com/p/orange-grass/source/browse/trunk/jni/Application.mk)

    APP_PLATFORM := android-10(注意,不同平台所支持的系统jni接口有所不同,由系统的c/c++头文件约束。缺省貌似是读取AndroidMenifest.xml的版本号?这个变量通常是缺省不写的)

    APP_ABI := armeabi(多数情况用armeabi,也可以指定all来编译当前ndk支持的所有cpu架构类型,或者指定x86,armeabi和armeabi-v7a其中的若干个)

    (20130411)

    3. 同一个Android.mk编译多个目标(同时编译依赖的静态库和jni动态库)(适用于只有一个依赖库的情况)

    (参考自:https://github.com/kenhys/zinnia-android/tree/master/jni)

    LOCAL_PATH:= $(call my-dir)

    #####

    include $(CLEAR_VARS)

    LOCAL_MODULE    := libzinnia

    LOCAL_SRC_FILES := character.cpp feature.cpp libzinnia.cpp param.cpp recognizer.cpp sexp.cpp svm.cpp trainer.cpp

    LOCAL_CFLAGS    := -Werror -DHAVE_CONFIG_H

    include $(BUILD_STATIC_LIBRARY)

    #####

    # JNI

    include $(CLEAR_VARS)

    LOCAL_MODULE    := libzinniajni

    LOCAL_SRC_FILES := libzinniajni.cpp

    LOCAL_STATIC_LIBRARIES := libzinnia

    include $(BUILD_SHARED_LIBRARY)

    4. 导出变量(用于静态库)

    LOCAL_EXPORT_C_INCLUDES

    LOCAL_EXPORT_LDLIBS

    (20130530)

    5. 获取签名字符串(GetMethodID的第四参数)

    cd bin/classes

    javap -s -private <类名全称>

    例如

    private void progress(long size, long timestamp, double duration)

    的签名是:

    (JJD)V

    则在JNI中获取该方法:

    jmethodID progress = (*env)->GetMethodID(env, cls, "progress", "(JJD)V");

    在JNI中调用(因为返回值为void,所以使用CallVoidMethod):

    (*env)->CallVoidMethod(env, obj, progress, size, timestemp, duration);

    参数中使用的在JNI中局部创建的对象(JNI局部引用)需要在调用后释放,例如:

    (*env)->CallVoidMethod(env, obj, log, result);

    (*env)->DeleteLocalRef(env, result);

    (*env)->DeleteLocalRef(env, stringClass);

    否则可能有堆栈崩溃的危险。

    (TODO:待补充)

  • 相关阅读:
    地铁线路问题分析
    软件工程大作业(社团管理系统)-个人总结报告
    第九组_社团管理系统_原型相关文档
    北京地铁线路出行和规划
    地铁线路规划
    WC 个人项目 ( node.js 实现 )
    自我介绍 + 软工5问
    软工个人项目(Java实现)
    自我介绍+软工五问
    结对编程(前后端分离)
  • 原文地址:https://www.cnblogs.com/sode/p/3148612.html
Copyright © 2011-2022 走看看