为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:
how to build c-ares library in android (NDK)