关闭

在Ubuntu上交叉编译Android libevent库

标签: AndroidUbuntu交叉编译libeventNDK
2854人阅读 评论(0) 收藏 举报
分类:

前言:这里我记录下我开发cocos2dx for Android所遇到的问题吧,也许有很多人跟我一样很迷茫,能记录一点是一点了,希望能做成一个系列帮助到大家,当然,最初还是帮助到我自己,我记性比较差。说实话,编译这个真的好多坑。


这段时间为在cocos2dx上找一个跨平台的socket通信库而烦恼(说实话,之前因为一直是写windows上服务器的,并且接触的东西也不深入,所以现在搞起来有点捉襟见肘,凡事总有个难的时候,现在说实话我倒是挺开心并且别人也挺羡慕我能专心研究这块领域的,老板也是,呵呵),找来找去无非就这几种办法:

  1. 自己用BSD规范写一个,比如ODSocket(谢谢提供这个的朋友)
  2. 找一个通用的库实现

其实是都尝试过,第一个现在还算是备选方案,主要还是想找一个好用的通用的库来做这个事情,于是我找来找去就找到了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未定义之类的。


在目录下执行脚本

直接输入./configure.sh即可,这样一下应该木有什么其他问题了,如果有请根据提示(一般会在当前文件夹下config.log文件中记录日志)修正。我之前是有报找不到C的编译库,然后arm-linux-androideabi-gcc这个找不到,最后发现是export的时候,目录写错了,少了个64,汗,请不要随便复制。


创建两个库文件的软连接

这里看了Stack Overflow上的文章,貌似NDK的toolchain不会去指定的lib目录下找库文件,所以会报crtbegin_so.o和crtend_so.o找不到的问题。这个就用土办法解决,直接在当前目录下建立对应文件的软连接即可,如下:
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

经过configure.sh后,就会生成Makefile文件了,可以打开看下,不过量好大,我是没仔细看。如果一路成功以后,对应的库文件就都生成在.libs目录中,还是个隐藏文件,直接把里面的几个.a文件拷出来即可。我附件中也会提供对应的库文件。


参考文章

  1. 这篇文章是第一篇我觉得libevent可行的参考 http://blog.csdn.net/optman/article/details/8651458
  2. 这篇文章让我放弃了cgywin转到Ubuntu上编译 http://blog.csdn.net/optman/article/details/8651458
  3. 这篇Stack Overflow基本就是我交叉编译的参考 http://stackoverflow.com/questions/11655911/cross-compiling-libevent-for-android
  4. make后报错,对应的crtbegin_so.o和crtend_so.o找不到的解决方法 http://stackoverflow.com/questions/6881164/crtbegin-so-o-missing-for-android-toolchain-custom-build
  5. 草根老师的博客,关于浮点运算报错的文章 http://blog.chinaunix.net/uid-26833883-id-3282967.html
  6. 这篇文章是讲如何用NDK编译开源库的,篇幅太大,我没仔细看,但是应该很有帮助 http://warpedtimes.wordpress.com/2010/02/03/building-open-source-libraries-with-android-ndk/

文件下载

libevent库下载,一共4个,分别是libevent.a、libevent_core.a、libevent_extra.a、libevent_pthreads.a
0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:347667次
    • 积分:4565
    • 等级:
    • 排名:第6428名
    • 原创:104篇
    • 转载:26篇
    • 译文:6篇
    • 评论:79条
    最新评论
    软件工程