昨天将libcurl java的封装写完,今天继续将libcurl移植到Android。
首先下载curl,我下载的是7.38.0这个版本(不是最新版本)。
我使用的是ubuntu 15.04 64位,下载了ndk r9d
首先配置一下环境变量,修改文件/etc/profile
个人比较喜欢使用vim,在终端中使用vim修改文件,增加如下内容:
export NDK_HOME=/opt/android-ndk-r9d
export TOOLCHAIN=$NDK_HOME/toolchains/arm-linux-androideabi-4.8/prebuilt/linux-x86_64/bin
export PATH=$TOOLCHAIN:$PATH
在Android NDK下编译libcurl,首先要生成头文件:
./configure --host=arm-linux --target=arm-linux CC=arm-linux-androideabi-gcc --disable-tftp --disable-sspi --disable-ipv6 --disable-ldaps --disable-ldap --disable-telnet --disable-pop3 --enable-ftp --without-ssl --disable-imap --disable-smtp --disable-pop3 --disable-rtsp --without-ca-bundle --disable-warnings --disable-manual --without-nss --enable-shared --without-zlib --without-random CFLAGS="-nostdlib" CPPFLAGS="-I$NDK_HOME/platforms/android-9/arch-arm/usr/include " LDFLAGS="-L$NDK_HOME/platforms/android-9/arch-arm/usr/lib/ -lc -ldl"
这个编译并不支持zlib和ssl,因为android需要另外单独编译这两个库,而且我们项目里面目前暂时也没有用到这方面的功能,因此等以后再来编译。
此时在lib/文件夹下找到生成的curl_config.h,在include/curl/文件夹下找到curlbuild.h
用Eclipse新建一个android应用,新建一个目录jni
将curl.xx源代码解压后命名为curl,放到jni文件夹下面,并将curl_config.h和curlbuild.h文件,分别放到curl/lib/文件夹和curl/include/curl/文件夹下面 。
编写一个Android.mk文件,内容如下:
LOCAL_PATH:= $(call my-dir)
CFLAGS := -Wpointer-arith -Wwrite-strings -Wunused -Winline \
-Wnested-externs -Wmissing-declarations -Wmissing-prototypes -Wno-long-long \
-Wfloat-equal -Wno-multichar -Wsign-compare -Wno-format-nonliteral \
-Wendif-labels -Wstrict-prototypes -Wdeclaration-after-statement \
-Wno-system-headers -DHAVE_CONFIG_H
include $(CLEAR_VARS)
include $(LOCAL_PATH)/curl/lib/Makefile.inc
LOCAL_SRC_FILES := $(addprefix curl/lib/,$(CSOURCES))
LOCAL_CFLAGS += $(CFLAGS)
LOCAL_MODULE:= libcurl
LOCAL_C_INCLUDES += $(LOCAL_PATH)/curl/include/ $(LOCAL_PATH)/curl/lib
include $(BUILD_SHARED_LIBRARY)
cd到jni目录下,执行:
ndk-build
就能够得到libcurl.so了。当然,也可以将libcurl编译成静态库进行调用。
安卓设备所采用的芯片比较多,为了发挥最大性能,可以新建一个Application.mk文件,这个文件里面,添加下面一行:
APP_ABI =armeabi armeabi-v7a x86
不添加默认就是按照armeabi来进行编译了,大多数的手机都能用,如果要发挥最大性能,最好是同时编译 armeabi-v7a 和x86。
这个so文件暂时还没有进行测试。等有功夫继续弄。