2014年5月

android编译支持ssl的libcurl

首先,按照http://zhigang.net/2013/08/yi-zhi-libcurldao-android-ndk.html,生成ndk编译环境:

 ~/dev/android-ndk-r8b/build/tools/make-standalone-toolchain.sh --install-dir=/tmp/ndk --platform=android-8

配置编译环境:
PATH=$PATH:/tmp/ndk/bin

LDFLAGS="-L /tmp/ndk/sysroot/usr/lib"
CPPFLAGS="-I /tmp/ndk/sysroot/usr/include/"
(以上两个有时候可以省略,或者靠指定 --sysroot解决。)
然后下载curl的源代码 http://curl.haxx.se/download.html

此时,不支持ssl的curl已经可以直接编译了:

./configure --host=arm-linux-androideabi ....
make

但是要加上ssl支持的话,
按照http://stackoverflow.com/questions/11330180/porting-libcurl-on-android-with-ssl-support, 到https://github.com/guardianproject/openssl-android 下载一个openssl,然后用ndk-build编译, 把libssl.solibcrypt.so放到/tmp/ndk/sysroot/usr/lib, 把include 放到 /tmp/ndk/sysroot/usr/include/.
然后编译的选项指定加入--with-ssl (如果是其他路径, 配置为 --with-ssl=<PATH>)

./configure --host=arm-linux-androideabi \
--with-ssl \
--disable-ftp \
--disable-gopher \
--disable-file \
--disable-imap \
--disable-ldap \
--disable-ldaps \
--disable-pop3 \
--disable-proxy \
--disable-rtsp \
--disable-smtp \
--disable-telnet \
--disable-tftp \
--without-gnutls \
--without-libidn \
--without-librtmp \
--disable-dict

config结果:

  curl version:     7.36.0
  Host setup:       arm-unknown-linux-androideabi
  Install prefix:   /usr/local
  Compiler:         arm-linux-androideabi-gcc
  SSL support:      enabled (OpenSSL)
  SSH support:      no      (--with-libssh2)
  zlib support:     enabled
  GSS-API support:  no      (--with-gssapi)
  SPNEGO support:   no      (--with-spnego)
  TLS-SRP support:  no      (--enable-tls-srp)
  resolver:         default (--enable-ares / --enable-threaded-resolver)
  ipv6 support:     no      (--enable-ipv6)
  IDN support:      no      (--with-{libidn,winidn})
  Build libcurl:    Shared=yes, Static=yes
  Built-in manual:  enabled
  --libcurl option: enabled (--disable-libcurl-option)
  Verbose errors:   enabled (--disable-verbose)
  SSPI support:     no      (--enable-sspi)
  ca cert bundle:   no
  ca cert path:     no
  LDAP support:     no      (--enable-ldap / --with-ldap-lib / --with-lber-lib)
  LDAPS support:    no      (--enable-ldaps)
  RTSP support:     no      (--enable-rtsp)
  RTMP support:     no      (--with-librtmp)
  metalink support: no      (--with-libmetalink)
  HTTP2 support:    disabled (--with-nghttp2)
  Protocols:        HTTP HTTPS

支持httphttps了。

make编译时,发现可以生成lib/.libs/libcurl.so了,但是静态文件libcurl.a 失败,

/tmp/ndk/bin/../lib/gcc/arm-linux-androideabi/4.6.x-google/../../../../arm-linux-androideabi/bin/ld: warning: libssl.so, needed by ../lib/.libs/libcurl.so, not found (try using -rpath or -rpath-link)
/tmp/ndk/bin/../lib/gcc/arm-linux-androideabi/4.6.x-google/../../../../arm-linux-androideabi/bin/ld: warning: libcrypto.so, needed by ../lib/.libs/libcurl.so, not found (try using -rpath or -rpath-link)

可以指定 -rpath-link

LIBS=" -Wl,-rpath-link=/tmp/ndk/sysroot/usr/lib" ./configure ....
make -j4

然后就编译完成了。