Chinaunix首页 | 论坛 | 博客
  • 博客访问: 403767
  • 博文数量: 53
  • 博客积分: 1910
  • 博客等级: 中尉
  • 技术积分: 1130
  • 用 户 组: 普通用户
  • 注册时间: 2010-05-10 14:56
文章分类

全部博文(53)

文章存档

2013年(1)

2012年(17)

2011年(33)

2010年(2)

分类: LINUX

2011-06-28 18:40:21


其实就是把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
 
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
 
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  如下:
  1. /* #undef _EVENT_HAVE_ARC4RANDOM */
  2.     这句下面加上:
  3.     #define _EVENT_HAVE_ARC4RANDOM
  4.     
  5.     //#define _EVENT_HAVE_FD_MASK 1 这句用//注掉
    
  * 写android mk file
   ./configure 生成的makefile不是人写的,是机器生成的
   所以参考makefile.am ,具体jni目录下Android.mk 如下:
   
  1. LOCAL_PATH := $(call my-dir)
  2. #########################
  3. # Build the libevent lib
  4. include $(CLEAR_VARS)
  5. LOCAL_MODULE := libevent
  6. # devpoll.c kqueue.c evport.c
  7. LOCAL_SRC_FILES := \
  8. select.c \
  9. poll.c \
  10. epoll.c \
  11. signal.c \
  12. event.c evthread.c buffer.c \
  13. bufferevent.c bufferevent_sock.c bufferevent_filter.c \
  14. bufferevent_pair.c listener.c bufferevent_ratelim.c \
  15. evmap.c log.c evutil.c evutil_rand.c strlcpy.c \
  16. event_tagging.c http.c evdns.c evrpc.c
  17. LOCAL_MODULE_TAGS := eng
  18. #LOCAL_SYSTEM_SHARED_LIBRARIES := \
  19. # libc
  20. #LOCAL_SHARED_LIBRARIES := libc
  21. LOCAL_LDLIBS := -lc
  22. LOCAL_C_INCLUDES := $(LOCAL_PATH)/compat $(LOCAL_PATH)/include $(LOCAL_PATH)/
  23. #$(LOCAL_PATH)/include/event2
  24. LOCAL_CFLAGS := -O2 -g -W -Wall -DHAVE_CONFIG_H #-fno-strict-aliasing # liu -fno-strict-aliasing
  25. LOCAL_PRELINK_MODULE := false
  26. include $(BUILD_SHARED_LIBRARY)
  27. #########################
  28. # Build the test binary
  29. include $(CLEAR_VARS)
  30. LOCAL_SRC_FILES := test/test-init.c
  31. LOCAL_MODULE := test_init
  32. LOCAL_MODULE_TAGS := eng
  33. #LOCAL_SYSTEM_SHARED_LIBRARIES := \
  34. # libevent \
  35. # libc
  36. LOCAL_SHARED_LIBRARIES := libevent
  37. LOCAL_LDLIBS := -lc
  38. LOCAL_C_INCLUDES := $(LOCAL_PATH)/include
  39. #LOCAL_CFLAGS := -O2 -g -W -Wall
  40. include $(BUILD_EXECUTABLE)
  41. #########################
  42. # Build the httpd binary
  43. include $(CLEAR_VARS)
  44. LOCAL_SRC_FILES := sample/http-server.c
  45. LOCAL_MODULE := test_httpd
  46. LOCAL_MODULE_TAGS := eng
  47. #LOCAL_SYSTEM_SHARED_LIBRARIES := \
  48. # libevent \
  49. # libc
  50. LOCAL_SHARED_LIBRARIES := libevent
  51. LOCAL_LDLIBS := -lc
  52. LOCAL_C_INCLUDES := $(LOCAL_PATH)/include
  53. #LOCAL_CFLAGS := -O2 -g -W -Wall
  54. include $(BUILD_EXECUTABLE)
      
    * jin下的Application.mk
     ndk emulator goodfish 是arm926的
     支持armv5t就可以了
    内容如下:
  1. 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_test emualtor
    执行  emulator @ndk_test
    跑起来后,缩到最小,以后不需要操作它了
    
   * 运行adb push
    将libevent.so ,test,test_httpd  3个
    文件全部push 到 emulator下的data目录下
   
   * 连到emualtor 下的httpd
     为了能在emulator 上跑,需要做下面修改
     修改jni\sample\http-server.c :
  1. //handle = evhttp_bind_socket_with_handle(http, "0.0.0.0", port);
  2.      
  3. 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
   * adb shell 运行:
     cd data
     ./test_httpd  /data
     显示:
     listening on 127.0.0.1:6060
     
   * 最后打开firefox 输入地址,可以看到:
   
  
4. 后续:
   可以继续深入libevent ,cgi,sqllite,写一个有实际作用的http server  
   
    
阅读(8364) | 评论(2) | 转发(1) |
给主人留下些什么吧!~~

liu0902012-02-17 13:41:38

itlyzong: 你好,

  * adb shell 运行:
     cd data
     ./test_httpd  /data
的时候显示:./test_httpd: permission denied
即使加上su
# su ./test_httpd /data
su.....
我是emulator 上试验的,你如果在真机上,可能需要开root权限
找个解root 的工具,开下root 再试验下看看

itlyzong2012-02-07 12:33:43

你好,

  * adb shell 运行:
     cd data
     ./test_httpd  /data
的时候显示:./test_httpd: permission denied
即使加上su
# su ./test_httpd /data
su: exec failed for /data Error:Permission denied
真心求教解决办法。