引用: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代码。

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

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

 

4. 编译apk和安装到手机

 

 

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

 

 

Bat代码  
  1. @set PATH="C:\WINDOWS"  
  2. @set PATH="C:\WINDOWS\system32";%PATH%  
  3. @set PATH="D:\java\apache-ant-1.8.1\bin";%PATH%  
  4.   
  5. @set JAVA_HOME="D:\java\jdk1.6.0_20"  
  6. @set PATH="D:\java\jdk1.6.0_20\bin";%PATH%  
  7.   
  8. @set PATH="D:\java\android-sdk_r10-windows\android-sdk-windows\platform-tools";%PATH%  
  9. @set PATH="D:\java\android-sdk_r10-windows\android-sdk-windows\tools";%PATH%  
  10. @cd /D "D:\java\android-sdk_r10-windows\android-sdk-windows\work"  
  11. @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官网中文页面

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工程的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

    我喜欢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-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/

 

 

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

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

 

 

(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:待补充)

 

更多相关文章

  1. NPM 和webpack 的基础使用
  2. 【阿里云镜像】使用阿里巴巴DNS镜像源——DNS配置教程
  3. android 快速入门
  4. Android资源文件简介
  5. AndroidManifest配置文件介绍
  6. Android系统权限和root权限
  7. Android小技术知识(多用于面试)
  8. android 五大布局文件
  9. Android(安卓)TabHost布局

随机推荐

  1. Android官方入门文档
  2. Android相机开发那些坑
  3. Android(安卓)stuido常用快捷方式整理
  4. Android深入浅出之Audio第三部分Audio Po
  5. Android和设计模式:模板模式
  6. Style在Android中的继承关系
  7. Android(安卓)正移植到C#
  8. Android安全性真相:危险被杀毒软件商夸大
  9. Android中LCD背光驱动
  10. Android新手入门 FAQ