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)

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