使用cygwin和NDK编译Android版本的libevent

前言:上次很兴奋,因为在Ubuntu上交叉编译了libevent的静态库,可是悲剧的是拿到windows上,用cygwin做链接的时候死活过不去,报event_init等一堆的未实现,可是静态库明明就在obj/local/armeabi目录下,并且打开静态库,也能找到对应的到处函数,为啥就是报找不到呢?反正我暂时还未搞懂,但是后来用cygwin编译出来的版本,貌似静态库有点区别,因为NDK的编译我还没搞清楚,在Ubuntu上我是指明了platforms和对应的编译器,不知道是否是不匹配造成的,不然NDK的目录里面也没必要有那么多gcc和ld的版本。由于才接触非windows平台的程序编译,总之就是糊里糊涂的,但是至少后来还是找了个办法在win7下使用cygwin编译出了cocos2dx能用的android版本的libevent。


编译前准备

我把我这里的编译方式和方法尽量说得详细点,至少我还未找到相关的文章,当然也可能是太简单了,而我坑得比较厉害的缘故。

编译环境

操作系统Win7 64bit
辅助编译环境cygwin 1.7.14
编译器NDK r8e
libevent版本2.0.21-stable(for Android)

这些都要自己准备好(包括下载,安装,对应的路径导出等等),去网上搜下即可,libevent的版本,后面会有下载地址,直接下载后面那个即可,先不要下载官方的版本。

libevent for Android 源代码准备

这里比较特殊的是用的是git上对应专门的for Android版本的libevent,这里有下载地址:https://github.com/ventureresearch/libevent/archive/patches-2.0.zip

这里需要注意,如果是在cygwin上,编译会有问题,貌似是cygwin下执行NDK,不支持linux下的软连接,而openssl里面的inlcude目录下的openssl目录中的所有头文件都是软连接。所以,如果要支持openssl,我这里还没辙(也许到linux下可行也不一定)。

对应的libevent压缩包解开后,放到cocos2dx目录下,我这里建立项目是通过tools中的python脚本实现的,所以所有的项目都会在cocos2dx的project目录下。然后编辑Android.mk文件,把支持openssl的源文件以及目录路径都删掉(不要简单用#注释,因为会把后面的反斜杠一起注释的,这样就导致剩下的大部分源文件都被注释了,这样编译出来的静态库会少很多函数)。文件内容我这里罗列一份:

####################################
# Build libevent as separate library

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)

LOCAL_ARM_MODE:= arm

LOCAL_MODULE:= event_static

LOCAL_MODULE_TAGS:= optional

#    bufferevent_openssl.c 

LOCAL_SRC_FILES := \
    buffer.c \
    bufferevent.c \
    bufferevent_filter.c \
    bufferevent_pair.c \
    bufferevent_ratelim.c \
    bufferevent_sock.c \
    epoll.c \
    epoll_sub.c \
    evdns.c \
    event.c \
    event_tagging.c \
    evmap.c \
    evrpc.c \
    evthread.c \
    evthread_pthread.c \
    evutil.c \
    evutil_rand.c \
    http.c \
    listener.c \
    log.c \
    poll.c \
    select.c \
    signal.c \
    strlcpy.c

#    external/openssl/include
LOCAL_C_INCLUDES := \
    $(LOCAL_PATH) \
    $(LOCAL_PATH)/android \
    $(LOCAL_PATH)/include


LOCAL_CFLAGS := -DHAVE_CONFIG_H -DANDROID -fvisibility=hidden

include $(BUILD_STATIC_LIBRARY)
#include $(BUILD_SHARED_LIBRARY)

好了,这里是告诉NDK如何编译libevent,并且生成对应的静态库名称为libevent_static.a。

编译到自己的项目

以上都准备好以后,可以打开自己的项目Android.mk,加入下面的语句:
LOCAL_C_INCLUDES := $(LOCAL_PATH)/../../Classes \
...
    $(LOCAL_PATH)/../../../../libevent \
    $(LOCAL_PATH)/../../../../libevent/include \
    $(LOCAL_PATH)/../../../../libevent/android
...
LOCAL_WHOLE_STATIC_LIBRARIES += event_static

...

$(call import-module,libevent)

中间的...就不要复制过去了。稍微解释下:
  1. 因为使用libevent,所以要告诉编译器对应的libevent的头文件在什么地方,比如这里的LOCAL_C_INCLUDES的设置,这里增加了libevent、libevent/include、以及libevent/android三个放头文件的目录,我的libevent目录是直接在cocos2dx目录下的,和project目录同层级。
  2. LOCAL_WHOLE_STATIC_LIBRARIES这里就是告诉编译器,要链接那个静态库,也就是libevent_staitc.a。
  3. 最后的语句,表示告诉NDK,需要编译外部的模块,找ibevent目录下的Android.mk
好了,这样就可以编译出自己要的libevent_staitc.a静态库了。在Android上测试可以用。
已标记关键词 清除标记
相关推荐
©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页