其实就是把libevent sample 下的http-server.c 在android emulator 上跑起来
环境:
libevent: libevent-2.0.12-stable
sdk : android-sdk-linux_86 支持到2.01
ndk : android-ndk-r4b-linux-x86
环境:
libevent: libevent-2.0.12-stable
sdk : android-sdk-linux_86 支持到2.01
ndk : android-ndk-r4b-linux-x86
1. 交叉编译
* 将libevent-2.0.12-stable 解压到home下libevent 目录
* 执行: ./configure --prefix=/home/liu/android-ndk-r4b/samples/libevent_install --host=arm-linux CC=~/tools/arm-2007q3/bin/arm-none-linux-gnueabi-gcc CXX=~/tools/arm-2007q3/bin/arm-none-linux-gnueabi-g++
make
make install
所有都安装到--prefix 所指定的目录中
* libevent 的maillist 上有直接用ndk toolchain 交叉编译成功的例子,
改成:
./configure --prefix=/home/liu/android-ndk-r4b/samples/libevent_install -host=arm-eabi CC=arm-linux-androideabi-gcc CPPFLAGS="-I$NDK_ROOT/platforms/android-8/arch-arm/usr/include/" CFLAGS="-nostdlib" LDFLAGS="-Wl,-rpath-link=$NDK_ROOT/platforms/android-8/arch-arm/usr/lib/ -L$NDK_ROOT/platforms/android-9/arch-arm/usr/lib/" LIBS="-lc"
听说也可以build成功libevent.so, 但是没弄成功
不过还好文件不多,还是按照ndk 下写andorid make file
* 将libevent-2.0.12-stable 解压到home下libevent 目录
* 执行: ./configure --prefix=/home/liu/android-ndk-r4b/samples/libevent_install --host=arm-linux CC=~/tools/arm-2007q3/bin/arm-none-linux-gnueabi-gcc CXX=~/tools/arm-2007q3/bin/arm-none-linux-gnueabi-g++
make
make install
所有都安装到--prefix 所指定的目录中
* libevent 的maillist 上有直接用ndk toolchain 交叉编译成功的例子,
改成:
./configure --prefix=/home/liu/android-ndk-r4b/samples/libevent_install -host=arm-eabi CC=arm-linux-androideabi-gcc CPPFLAGS="-I$NDK_ROOT/platforms/android-8/arch-arm/usr/include/" CFLAGS="-nostdlib" LDFLAGS="-Wl,-rpath-link=$NDK_ROOT/platforms/android-8/arch-arm/usr/lib/ -L$NDK_ROOT/platforms/android-9/arch-arm/usr/lib/" LIBS="-lc"
听说也可以build成功libevent.so, 但是没弄成功
不过还好文件不多,还是按照ndk 下写andorid make file
2. NDK下编译
* 把libevent-2.0.12-stable 解压到home 目录下的libevent-ndk 目录下的jni 目录
* 把前面交叉编译 生成的libevent/include/event2/event-config.h copy
到libevent-ndk/jin/include/event2/ 下
* 修改 event-config.h 如下:
* 写android mk file
./configure 生成的makefile不是人写的,是机器生成的
所以参考makefile.am ,具体jni目录下Android.mk 如下:
* 把libevent-2.0.12-stable 解压到home 目录下的libevent-ndk 目录下的jni 目录
* 把前面交叉编译 生成的libevent/include/event2/event-config.h copy
到libevent-ndk/jin/include/event2/ 下
* 修改 event-config.h 如下:
- /* #undef _EVENT_HAVE_ARC4RANDOM */
- 这句下面加上:
- #define _EVENT_HAVE_ARC4RANDOM
-
- //#define _EVENT_HAVE_FD_MASK 1 这句用//注掉
* 写android mk file
./configure 生成的makefile不是人写的,是机器生成的
所以参考makefile.am ,具体jni目录下Android.mk 如下:
- LOCAL_PATH := $(call my-dir)
- #########################
- # Build the libevent lib
- include $(CLEAR_VARS)
- LOCAL_MODULE := libevent
- # devpoll.c kqueue.c evport.c
- LOCAL_SRC_FILES := \
- select.c \
- poll.c \
- epoll.c \
- signal.c \
- event.c evthread.c buffer.c \
- bufferevent.c bufferevent_sock.c bufferevent_filter.c \
- bufferevent_pair.c listener.c bufferevent_ratelim.c \
- evmap.c log.c evutil.c evutil_rand.c strlcpy.c \
- event_tagging.c http.c evdns.c evrpc.c
- LOCAL_MODULE_TAGS := eng
- #LOCAL_SYSTEM_SHARED_LIBRARIES := \
- # libc
- #LOCAL_SHARED_LIBRARIES := libc
- LOCAL_LDLIBS := -lc
- LOCAL_C_INCLUDES := $(LOCAL_PATH)/compat $(LOCAL_PATH)/include $(LOCAL_PATH)/
- #$(LOCAL_PATH)/include/event2
- LOCAL_CFLAGS := -O2 -g -W -Wall -DHAVE_CONFIG_H #-fno-strict-aliasing # liu -fno-strict-aliasing
- LOCAL_PRELINK_MODULE := false
- include $(BUILD_SHARED_LIBRARY)
- #########################
- # Build the test binary
- include $(CLEAR_VARS)
- LOCAL_SRC_FILES := test/test-init.c
- LOCAL_MODULE := test_init
- LOCAL_MODULE_TAGS := eng
- #LOCAL_SYSTEM_SHARED_LIBRARIES := \
- # libevent \
- # libc
- LOCAL_SHARED_LIBRARIES := libevent
- LOCAL_LDLIBS := -lc
- LOCAL_C_INCLUDES := $(LOCAL_PATH)/include
- #LOCAL_CFLAGS := -O2 -g -W -Wall
- include $(BUILD_EXECUTABLE)
- #########################
- # Build the httpd binary
- include $(CLEAR_VARS)
- LOCAL_SRC_FILES := sample/http-server.c
- LOCAL_MODULE := test_httpd
- LOCAL_MODULE_TAGS := eng
- #LOCAL_SYSTEM_SHARED_LIBRARIES := \
- # libevent \
- # libc
- LOCAL_SHARED_LIBRARIES := libevent
- LOCAL_LDLIBS := -lc
- LOCAL_C_INCLUDES := $(LOCAL_PATH)/include
- #LOCAL_CFLAGS := -O2 -g -W -Wall
- include $(BUILD_EXECUTABLE)
* jin下的
Application.mk
ndk emulator goodfish 是arm926的
支持armv5t就可以了
内容如下:
ndk emulator goodfish 是arm926的
支持armv5t就可以了
内容如下:
- APP_ABI := armeabi
* 可以开始编译了
在ndk 安装目录下执行
./ndk-build -C ~/libevent-ndk/
成功之后在~/libevent-ndk/obj/local/armeabi目录下
生成3个文件:libevent.so ,test,test_httpd
3. 开始测试:
买不起真机也没关系,使用emulator
* 跑到sdk tools 目录下:
执行 android create avd -n ndk_test -t 1
在ndk 安装目录下执行
./ndk-build -C ~/libevent-ndk/
成功之后在~/libevent-ndk/obj/local/armeabi目录下
生成3个文件:libevent.so ,test,test_httpd
3. 开始测试:
买不起真机也没关系,使用emulator
* 跑到sdk tools 目录下:
执行 android create avd -n ndk_test -t 1
然后配置
* 运行ndk_test emualtor
执行 emulator @ndk_test
跑起来后,缩到最小,以后不需要操作它了
* 运行ndk_test emualtor
执行 emulator @ndk_test
跑起来后,缩到最小,以后不需要操作它了
* 运行adb push
将libevent.so ,test,test_httpd 3个
文件全部push 到 emulator下的data目录下
* 连到emualtor 下的httpd
为了能在emulator 上跑,需要做下面修改
修改jni\sample\http-server.c :
修改jni\sample\http-server.c :
- //handle = evhttp_bind_socket_with_handle(http, "0.0.0.0", port);
-
- handle = evhttp_bind_socket_with_handle(http, "127.0.0.1", 6060);
重新 ./ndk-build -C ~/libevent-ndk/
把新的test_httpd push 到emualtor data 目录下
执行 adb forward tcp:6060 tcp:6060
把新的test_httpd push 到emualtor data 目录下
执行 adb forward tcp:6060 tcp:6060
* adb shell 运行:
cd data
./test_httpd /data
显示:
listening on 127.0.0.1:6060
* 最后打开firefox 输入地址,可以看到:
4. 后续:
可以继续深入libevent ,cgi,sqllite,写一个有实际作用的http server
* 最后打开firefox 输入地址,可以看到:
4. 后续:
可以继续深入libevent ,cgi,sqllite,写一个有实际作用的http server