爲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: