goahead移植到Android

来源:互联网 发布:软件开发企业资质证书 编辑:程序博客网 时间:2024/06/07 05:19
转载请标明出处:http://blog.csdn.net/u013752202/article/details/78569470
goahead简介:
goahead是嵌入式开发常用的开源的http服务器(Web Server),作为针对嵌入式设计的服务程序,goahead体积小巧、内存消耗低、CPU占用少,支持跨平台。作为开源的http服务器,goahead功能强大,版本更新速度快,兼容最新的Web技术。(个人测试觉得比boa好用,在嵌入式资源跑Apache吃力的时候goahead绝对是很好的选择)
移植到Android系统:
这里的说的Android开发,是指嵌入式Android系统开发,跟Android app开发不同的是,嵌入式Android开发需要自己对Android源代码进行裁剪定制。
1.libgo.so编译
(1)保持原来的Makefile中的变量等不变,找到libgo.so的所有依赖文件,和编译FLAG(包括CFLAGS/DFLAGS/LDFLAGS等),然后依赖文件赋值给LOCAL_SRC_FILES,所有的FLAG赋值给LOCAL_CFLAGS,再指定LOCAL_C_INCLUDES的目录,其他的按照Android.mk的规则就行。其中-lrt,-lpthread,-ldl,-lm等Android会自动链接,无需显示的指定。
(2)编译过程中可能会遇到一些问题:
a. error: storage class specified for parameter "..."
error: expected declaration specifiers before "..."
源文件中有无法识别的符号导致,很有可能linux系统下的宏被Android裁剪掉了。找到这个宏,要么重新定义,要么删除。
比如: extern int pthread_mutexattr_settype (pthread_mutexattr_t *__attr, int __kind) __THROW;
__THROW这个宏在Android里面被裁剪掉了,所以直接去掉即可。
b. static char *getpass(char *prompt)这个函数本来是linux下unistd.h里面声明的函数,在Android中的unistd.h中也被裁剪掉了,这个函数不能直接删除,那么就必须重新实现。
在Android.mk中的LOCAL_CFLAG里面加上-DANDROID,然后在代码中实现static char *getpass(char *prompt)。
#ifdef ANDROID#define MAX_PASS    64static char *getpass(char *prompt){    static char password[MAX_PASS];    int     c, i;     fputs(prompt, stdout);    for (i = 0; i < (int) sizeof(password) - 1; i++) {         c = getchar();         if (c == '\r' || c == EOF) {            break;        }        if ((c == '\b' || c == 127) && i > 0) {            password[--i] = '\0';            fputs("\b \b", stdout);            i--;        } else if (c == 26) {           /* Control Z */            c = EOF;            break;        } else if (c == 3) {            /* Control C */            fputs("^C\n", stdout);            exit(255);        } else if (!iscntrl((uchar) c) && (i < (int) sizeof(password) - 1)) {            password[i] = c;            fputc('*', stdout);        } else {            fputc('', stdout);            i--;        }    }    if (c == EOF) {        return "";    }    fputc('\n', stdout);    password[i] = '\0';    return sclone(password);}#endif
下面是Android.mk的libgo.so部分
##   goahead-linux-default.mk -- Makefile to build Embedthis GoAhead for linux#LOCAL_PATH:= $(call my-dir)###########################################libgo.go############################################include $(CLEAR_VARS)NAME                  := goaheadVERSION               := 3.6.3PROFILE               ?= defaultARCH                  ?= $(shell uname -m | sed 's/i.86/x86/;s/x86_64/x64/;s/arm.*/arm/;s/mips.*/mips/')CC_ARCH               ?= $(shell echo $(ARCH) | sed 's/x86/i686/;s/x64/x86_64/')OS                    ?= linuxCC                    ?= gccCONFIG                ?= $(OS)-$(ARCH)-$(PROFILE)BUILD                 ?= build/$(CONFIG)LBIN                  ?= $(BUILD)/binPATH                  := $(LBIN):$(PATH)ME_COM_COMPILER       ?= 1ME_COM_LIB            ?= 1ME_COM_MATRIXSSL      ?= 0ME_COM_MBEDTLS        ?= 1ME_COM_NANOSSL        ?= 0ME_COM_OPENSSL        ?= 0ME_COM_OSDEP          ?= 1ME_COM_SSL            ?= 1ME_COM_VXWORKS        ?= 0ME_COM_OPENSSL_PATH   ?= "/usr/lib"ifeq ($(ME_COM_LIB),1)    ME_COM_COMPILER := 1endififeq ($(ME_COM_MBEDTLS),1)    ME_COM_SSL := 1endififeq ($(ME_COM_OPENSSL),1)    ME_COM_SSL := 1endifCFLAGS                += -fPIC -fstack-protector --param=ssp-buffer-size=4 -Wformat -Wformat-security -Wl,-z,relro,-z,now -Wl,--as-needed -Wl,--no-copy-dt-needed-entries -Wl,-z,noexecstatck -Wl,-z,noexecheap -wDFLAGS                += -DME_DEBUG=1 -D_REENTRANT -DPIC -D_FORTIFY_SOURCE=2 $(patsubst %,-D%,$(filter ME_%,$(MAKEFLAGS))) -DME_COM_COMPILER=$(ME_COM_COMPILER) -DME_COM_LIB=$(ME_COM_LIB) -DME_COM_MATRIXSSL=$(ME_COM_MATRIXSSL) -DME_COM_MBEDTLS=$(ME_COM_MBEDTLS) -DME_COM_NANOSSL=$(ME_COM_NANOSSL) -DME_COM_OPENSSL=$(ME_COM_OPENSSL) -DME_COM_OSDEP=$(ME_COM_OSDEP) -DME_COM_SSL=$(ME_COM_SSL) -DME_COM_VXWORKS=$(ME_COM_VXWORKS)IFLAGS                += "-I$(BUILD)/inc"LDFLAGS               += '-rdynamic' '-Wl,--enable-new-dtags' '-Wl,-rpath,$$ORIGIN/'LIBPATHS              += -L$(BUILD)/binLIBS                  += -lrt -ldl -lpthread -lmDEBUG                 ?= debugCFLAGS-debug          ?= -gDFLAGS-debug          ?= -DME_DEBUGLDFLAGS-debug         ?= -gDFLAGS-release        ?=CFLAGS-release        ?= -O2LDFLAGS-release       ?=CFLAGS                += $(CFLAGS-$(DEBUG))DFLAGS                += $(DFLAGS-$(DEBUG))LDFLAGS               += $(LDFLAGS-$(DEBUG))LDFLAGS+=-D_FILE_OFFSET_BITS=64 -D_FILE_OFFSET_BITS=64 -DMBEDTLS_USER_CONFIG_FILE=\"embedtls.h\"#defined by myselfLDFLAGS+=-DANDROIDLOCAL_SRC_FILES:=  src/action.c \               src/alloc.c \               src/auth.c \               src/cgi.c \               src/crypt.c \               src/file.c \               src/fs.c \               src/http.c \               src/js.c \               src/jst.c \               src/options.c \               src/osdep.c \               src/rom.c \               src/route.c \               src/runtime.c \               src/socket.c \               src/time.c \               src/upload.c \               src/mbedtls/mbedtls.c \               src/goahead-mbedtls/goahead-mbedtls.c \               src/goahead-openssl/goahead-openssl.cLOCAL_C_INCLUDES:=$(LOCAL_PATH)/src/ \                       $(LOCAL_PATH)/build/linux-x64-default/inc/LOCAL_CFLAGS:=$(CFLAGS)LOCAL_CFLAGS+=$(DFLAGS)LOCAL_CFLAGS+=$(LDFLAGS)LOCAL_MODULE_TAGS := optionalLOCAL_MODULE_OWNER := zhanghwLOCAL_MODULE := libgoinclude $(BUILD_SHARED_LIBRARY)
2.goahead编译
紧接上面的写,这里需要依赖上面生成的libgo.so,
LOCAL_SHARED_LIBRARIES:=libgo
下面是goahead部分:
################################goahead####################################include $(CLEAR_VARS)LOCAL_SRC_FILES=src/goahead.c \        src/mbedtls/mbedtls.c \        src/goahead-mbedtls/goahead-mbedtls.c \        src/goahead-openssl/goahead-openssl.cLOCAL_C_INCLUDES:=$(LOCAL_PATH)/src/ \                               $(LOCAL_PATH)/build/linux-x64-default/inc/LOCAL_SHARED_LIBRARIES:=libgoLOCAL_CFLAGS:=$(CFLAGS)LOCAL_CFLAGS+=$(DFLAGS)LOCAL_CFLAGS+=$(LDFLAGS)LOCAL_MODULE_TAGS := optionalLOCAL_MODULE_OWNER := zhanghwLOCAL_MODULE := goaheadinclude $(BUILD_EXECUTABLE)
3.goahead-test和gopass的编译也是一样,这里用不到,所以不编译进去。
4.配置文件拷贝和相关目录建立
紧接上面的Android.mk:
##################################copy config files###########################include $(CLEAR_VARS)$(shell mkdir -p $(TARGET_OUT_DATA))$(shell cp -rf $(LOCAL_PATH)/goaheadconf/goahead/ $(TARGET_OUT_DATA)) 

原创粉丝点击