前言:这里我记录下我开发cocos2dx for Android所遇到的问题吧,也许有很多人跟我一样很迷茫,能记录一点是一点了,希望能做成一个系列帮助到大家,当然,最初还是帮助到我自己,我记性比较差。说实话,编译这个真的好多坑。
这段时间为在cocos2dx上找一个跨平台的socket通信库而烦恼(说实话,之前因为一直是写windows上服务器的,并且接触的东西也不深入,所以现在搞起来有点捉襟见肘,凡事总有个难的时候,现在说实话我倒是挺开心并且别人也挺羡慕我能专心研究这块领域的,老板也是,呵呵),找来找去无非就这几种办法:
- 自己用BSD规范写一个,比如ODSocket(谢谢提供这个的朋友)
- 找一个通用的库实现
其实是都尝试过,第一个现在还算是备选方案,主要还是想找一个好用的通用的库来做这个事情,于是我找来找去就找到了libevent,网上搜了下,貌似也有成功在iOS、windows、Android上成功编译通过并能用的例子。iOS上倒更好,直接有人把编译好的几个静态库文件共享出来,Android上有人这么搞就好了,当然,如果我编译好了,会共享给大家的。
准备工作
下载libevent源码
首先去git上下一个专门给Android用的libevent(应该只是多写了一个Android.mk),下载地址:https://github.com/ventureresearch/libevent 然后释放到本地。
释放的话,因为下载过来的是zip格式的,可以运行unzip命令释放,如果没有,则用sudo apt-get install unzip 装一个即可(前提要联网)
运行环境
我这里以ubuntu为例子,ubuntu我是装了个虚拟机,然后使用的是12.04.2 LTS 64位server版,文件共享的话直接装个winscp即可,然后如果ssh过不去的话在ubuntu上安装一个openssh,如:sudo apt-get install openssh 一路按yes到末尾即可。至于winscp怎么用我就不赘述了,自己去google或者百度,或者直接打开用下看就懂了。
编译准备
在释放的文件中,先运行./autogen.sh,先生成对应的configure文件,其间可能需要automake和libtool,没有的话请用老办法 sudo apt-get install xxx 自行安装。
autogen.sh运行结束后,目录下应该会多出许多configure相关的文件,还有install.sh文件等等。
导出环境变量
export NDK_ROOT=work/Android/android-ndk-r8e
export PATH=$PATH:$NDK_ROOT/toolchains/arm-linux-androideabi-4.7/prebuilt/linux-x86_64/bin
当然,NDK这个自己首先要下载好,请根据自己的机器和操作系统下载对应的版本,我机器使用的是NDK是r8e linux64位的版本。后面加入到PATH是为了能找到arm-linux-androideabi-gcc这个编译器
写configure.sh
#! /bin/sh
./configure \
--host=arm-linux-androideabi \
CC=arm-linux-androideabi-gcc \
LD=arm-linux-androideabi-ld \
CPPFLAGS="-I$NDK_ROOT/platforms/android-14/arch-arm/usr/include/" \
CFLAGS="-nostdlib" \
LDFLAGS="-Wl,-rpath-link=$NDK_ROOT/platforms/android-14/arch-arm/usr/lib/ -L$NDK_ROOT/platforms/android-14/arch-arm/usr/lib/" \
LIBS="-lc -lgcc -L$NDK_ROOT/toolchains/arm-linux-androideabi-4.7/prebuilt/linux-x86_64/lib/gcc/arm-linux-androideabi/4.7"
这里根据自己机器上的环境配置,这里配置的是android-14的platform,然后对应的编译工具是使用4.7的。
这里有个要注意的地方,因为arm本身不支持浮点运算,所以要通过软浮点库来实现,这个库就是libgcc.a,所以这里要连接-lgcc,并且对应的库已经在toolchains中提供了,后面的目录是指明libgcc.a的位置。make后面的test例子的时候有用到对应的除法,可能会报XXXMOD未定义之类的。
在目录下执行脚本
创建两个库文件的软连接
ln -s $NDK_ROOT/platforms/android-14/arch-arm/usr/lib/crtbegin_so.o
ln -s $NDK_ROOT/platforms/android-14/arch-arm/usr/lib/crtend_so.o
这样,当前libevent目录下就会有这两个文件的软连接,等下make的时候也就不会报这两个文件找不到了。当然,我这里是相当于把问题都说在前面了,当然大家也可以先make后再解决这个问题,毕竟我是这条弯路上走过来的
执行make
参考文章
- 这篇文章是第一篇我觉得libevent可行的参考 http://blog.youkuaiyun.com/optman/article/details/8651458
- 这篇文章让我放弃了cgywin转到Ubuntu上编译 http://blog.youkuaiyun.com/optman/article/details/8651458
- 这篇Stack Overflow基本就是我交叉编译的参考 http://stackoverflow.com/questions/11655911/cross-compiling-libevent-for-android
- make后报错,对应的crtbegin_so.o和crtend_so.o找不到的解决方法 http://stackoverflow.com/questions/6881164/crtbegin-so-o-missing-for-android-toolchain-custom-build
- 草根老师的博客,关于浮点运算报错的文章 http://blog.chinaunix.net/uid-26833883-id-3282967.html
- 这篇文章是讲如何用NDK编译开源库的,篇幅太大,我没仔细看,但是应该很有帮助 http://warpedtimes.wordpress.com/2010/02/03/building-open-source-libraries-with-android-ndk/