cocos2dx使用libevent库

之前一直在纠结如何在跨平台上实现一层socket封装,找了蛮多的东西,也自己用ODSocket包了一层使用过,但是效果不是很理想,开个线程做数据接收以及对应的多线程更新界面会带来很多问题(耗费了一下午的时间)。也看来sockctcc,官网上没有对应windows支持(按道理实在不行价格宏定义针对编译也行,这个倒是可以参考ODSocket的做法),我又是个很懒的人,自己维护代码总是比较麻烦。后来找到libevent,大致看了下介绍,是个跨平台的网络库,并且成功案例相当之多,一般在客户端上我觉得用用还有些太奢侈,在普通客户上,用用select模型估计都够了。然后今天又搜了下,也有达人对此库编译到cocos2dx中,使得其支持win32、ios、android,不敢独享,拿出来给大家看下。

libevent下载(libevent-2.0.21-stable),大家也可以去官网下载。上面也有很多教程教你如何使用。
其实大家可以去搜下关于libevent的相关信息,我也能搜到,想必大家也行。

这里推荐个文章是讲如何把libevent编译到3个平台中的,大家可以看下,有问题一起探讨。
http://blog.csdn.net/tangkaiqi/article/details/8437966

编译过了。上面的都有问题。我自己在ubuntu上交叉编译后,生成了对应的libevent.a, libevent_core.a, libevent_extras.a 和 libevent_pthreads.a, 并且打开对应库文件是能找到event_init()等库的,但是放到windows上,用cygwin编译连接这几个静态库的时候出问题了,报找不到event_init等导出函数。最后我还是使用git上下过来的那份代码,并且直接把libevent整个放到cocos2dx目录下,然后在删掉对应openssl的c文件以及对应的include目录。直接挂在整个项目中编译,然后就直接可以通过了。

本来就直接可以在NDK下使用Android.mk进行编译和连接。注意对应的MODULE_NAME和库名,当然,在jni下的Android.mk也是需要填上相应的libevent库和目录的。注意要包含源码中的Android目录,当然,如果是windows的话要增加WIN32-Code目录,因为event_config.h是有所差别的

event_mm_malloc_这个的问题解决了,只要在编译选项中增加-levent即可,如我这里eclipse中的命令行语句为『bash ${ProjDirPath}/build_native.sh NDK_DEBUG=1 -j4 -levent』。
libevent的话,可以在JNI下的android.mk中增加对应的文件目录,可以参考libcurl的配置,然后把生成的libevent.a文件放到libs文件夹下的对应的ABI目录去,如armeabi、armeabi-v7a、x86等,看你编译了几个ABIs了。

— Begin quote from ____

?色生命? 发表于 2013-5-12 01:32 url

楼主你是怎么编译的libevent 在ios下 ,, 我编不过,好多错

— End quote

iOS尚未编译 = =!网上貌似有人共享了对应的静态库文件,你可以找下。我现在主要是在弄Android上的版本。

— Begin quote from ____

?色生命? 发表于 2013-5-12 01:32 url

楼主你是怎么编译的libevent 在ios下 ,, 我编不过,好多错

— End quote

OS X 10.8 64-bit 上我编译过了,现在试试用Xcode中的编译器交叉编译下对应平台下的libevent库,如果过了,我会给出对应的库文件的。

  • 本帖最后由 sosoayaen 于 2013-5-14 16:01 编辑 *

iOS的我这里编译过了,针对的是官方的2.0.21-stable,具体是看了OnionBroswer的libevent编译部分,可以参考这里:
https://github.com/mtigas/iOS-OnionBrowser/blob/master/build-libevent.sh

首先下载libevent的库文件,如果是官方的2.0.21的话,会自带configure文件,如果是git上的那个for Android的版本,则要先运行目录下的autogen.sh文件,生成configure。其间可能需要安装automake、autoconf、libtool等工具,这个直接下载源码后,在其目录下执行以下命令

./configure && make
sudo make install

我这里的Xcode是4.3.1版本的,对应的SDK是6.0。然后编写一个build_libevent.sh(这个可以参考下开始的链接)文件,循环编译3个CPU类型的库文件:i386,armv7a和armv7s,分别对应模拟器和真机的两种CPU。

做了下小修改,可以看这里的build_libevent.sh内容:

SDKVERSION="6.0"
ARCHS="i386 armv7 armv7s"
DEVELOPER="/Users/JasonTou/Desktop/Xcode.app/Contents/Developer"
DIRS=$(pwd)
INTERDIR="${DIRS}/../built"
OUTPUTDIR="${DIRS}/../"

mkdir -p ${INTERDIR}
mkdir -p ${OUTPUTDIR}/lib
mkdir -p ${OUTPUTDIR}/include

for ARCH in ${ARCHS}
do
        if  "${ARCH}" == "i386" ];
        then
                PLATFORM="iPhoneSimulator"
                EXTRA_CONFIG=""
        else
                PLATFORM="iPhoneOS"
                EXTRA_CONFIG="--host=arm-apple-darwin11"
        fi

        mkdir -p "${INTERDIR}/${PLATFORM}${SDKVERSION}-${ARCH}.sdk"

        ./configure --disable-shared --enable-static --disable-debug-mode ${EXTRA_CONFIG} 
                --prefix="${INTERDIR}/${PLATFORM}${SDKVERSION}-${ARCH}.sdk" 
                CC="${DEVELOPER}/Platforms/${PLATFORM}.platform/Developer/usr/bin/gcc -arch ${ARCH}" 
                LDFLAGS="$LDFLAGS -L${OUTPUTDIR}/lib" 
                CFLAGS="$CFLAGS -I${OUTPUTDIR}/include -isysroot ${DEVELOPER}/Platforms/${PLATFORM}.platform/Developer/SDKs/${PLATFORM}${SDKVERSION}.sdk" 
                CCPFLAGS="$CCPFLAGS -I${OUTPUTDIR}/include -isysroot ${DEVELOPER}/Platforms/${PLATFORM}.platform/Developer/SDKs/${PLATFORM}${SDKVERSION}.sdk"
        make
        make install
        make clean
done

讲下要注意的地方。交叉编译使用的gcc是在Xcode中的,我这里是指定了绝对路径,相对路径会报错。
结束后对应的库会安装到父文件夹的built目录中,分别在iPhoneSimulator60-i386.sdk、iPhoneOS60-armv7.sdk和iPhoneOS60-armv7s.sdk的lib目录中。
1059

好吧,昨天我没仔细看,一直在捣鼓对应libevent的openssl,一直搞不出来。今天静下心发现原来洋葱浏览器里面都给你实现好了,汗死。在cocos2dx上可能需要增加头文件到对应的目录中去,比如做一个prebuilt之类的。

iOS上可以使用lipo命令把不同平台的静态库打包成一份,这样就不用针对每个平台发布代码了,真心好啊~还不知道Android是否支持此功能呢。

正在学习中
http://blog.csdn.net/sozell/article/details/8926090