android下使用libcurl和c-ares 顶 原

为android NDK编译配置c-ares:

1. 设置环境变量NDK:

export NDK=/media/data/dev_tools/android-ndk-r9d

2. 工具链

$NDK/build/tools/make-standalone-toolchain.sh \
--platform=android-9 \
--install-dir=/tmp/my-android-toolchain

3. 为编译工具设置环境变量

export PATH=/tmp/my-android-toolchain/bin:$PATH
export SYSROOT=/tmp/my-android-toolchain/sysroot
export CC="arm-linux-androideabi-gcc --sysroot $SYSROOT"

4. 下载c-ares

URL为http://c-ares.haxx.se/download/。

最新版本为1.10。

5. 解压并配置

# Configure
cd c-ares-1.10.0 && mkdir build
./configure --prefix=$(pwd)/build \
--host=arm-linux-androideabi \
--disable-shared \
CFLAGS="-march=armv7-a"

拿meld等对比工具对比配置前后的两份code的内容,就知道,这个过程主要是创建了Makefile,ares_config.h等文件,并重新生成了ares_build.h。这些文件主要用于根据环境对c-ares的行为进行定制。

6. 编译

有两种方法可以用于编译c-ares,一是直接在项目外,利用我们前面做的配置,编译c-ares为单独的so,具体需要执行的命令为:

# Build and install
make && make install

二是将c-ares的source code放进我们项目的jni目录下,与我们项目的其它的source code一起编译。

(1). 将c-ares的source code copy到jni/3rd/curl/c-ares下。

(2). 修改Android.mk,在适当的位置加入如下的内容:

#c-ares-1.10.0 code
LOCAL_SRC_FILES += 3rd/curl/c-ares/ares__close_sockets.c \
	3rd/curl/c-ares/ares__get_hostent.c \
	3rd/curl/c-ares/ares__read_line.c \
	3rd/curl/c-ares/ares__timeval.c \
	3rd/curl/c-ares/ares_cancel.c \
	3rd/curl/c-ares/ares_create_query.c \
	3rd/curl/c-ares/ares_data.c \
	3rd/curl/c-ares/ares_destroy.c \
	3rd/curl/c-ares/ares_expand_name.c \
	3rd/curl/c-ares/ares_free_hostent.c \
	3rd/curl/c-ares/ares_free_string.c \
	3rd/curl/c-ares/ares_gethostbyname.c \
	3rd/curl/c-ares/ares_getsock.c \
	3rd/curl/c-ares/ares_init.c \
	3rd/curl/c-ares/ares_library_init.c\
	3rd/curl/c-ares/ares_llist.c \
	3rd/curl/c-ares/ares_nowarn.c \
	3rd/curl/c-ares/ares_options.c \
	3rd/curl/c-ares/ares_parse_a_reply.c \
	3rd/curl/c-ares/ares_parse_aaaa_reply.c \
	3rd/curl/c-ares/ares_process.c \
	3rd/curl/c-ares/ares_query.c \
	3rd/curl/c-ares/ares_search.c \
	3rd/curl/c-ares/ares_send.c \
	3rd/curl/c-ares/ares_strerror.c \
	3rd/curl/c-ares/ares_timeout.c \
	3rd/curl/c-ares/ares_version.c \
	3rd/curl/c-ares/bitncmp.c \
	3rd/curl/c-ares/inet_net_pton.c


LOCAL_C_INCLUDES += $(LOCAL_PATH)/3rd/curl/c-ares

c-ares总共有50多个c源文件,为什么只编译这些,而不把其它的那些一并加入编译呢?

判断要编译这些文件而可以不编译其它那些的方法为,给编译libcurl的CFLAGS加上-DUSE_ARES,编译器和链接器会告诉我们到底需要哪些文件。比如,由于没有加入某个文件,而报了因为引用到那个文件中定义的函数的undefined reference error了,我们就知道一定要加入那个文件了。依次方法多次尝试,终于找全了我们需要编译的全部的源文件。

如果我们编译时,没有获得configure时生成的ares_build.h,ares_config.h等文件,则编译时就会提示找不到头文件之类的错误。

Done。

References:

libcurl-for-android

libcurl official site

c-ares official site

how to build c-ares library in android (NDK)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章