2012-07-04 22 views
6

Estoy tratando de portar libCurl a android con soporte SSL, paso uno sería portar el rizo sin soporte SSL, supongo, así que comencé a hacerlo. pero me encuentro con un problema.portando libcurl en android con soporte ssl

como leo en el sitio web de desarrollo y en el archivo Android.mk, la parte difícil es configurar la marca primero. así que lo que hice es:

  1. descargar el código fuente de Android (! y compilarlo ya que algunas de las librerías intermedios son necesarios)

  2. Descargar cURL

  3. de desempaquetado rizo en: {android_src}/externo/curl

  4. crea el script configure para curl creando un archivo sh en la carpeta externa/curl con este contenido.

`

export A=/home/user/Development/AOSP/2.3.3  
export CC=$A/prebuilt/linux-x86/toolchain/arm-eabi-4.2.1/bin/arm-eabi-gcc 
export NDK=/home/user/Development/Tools/sdk/android/ndk 
export NDKLIBS=$NDK/platforms/android-4/arch-arm/usr/include 
export SYSROOT=$A/ndk/build/platforms/android-4/arch-arm 
export CPPFLAGS="-I $A/system/core/include" 
export LDFLAGS="-L$A/out/target/product/generic/obj/lib/ -L$A/out/target/product/generic/system/lib/-L$SYSROOT/usr/lib -Wl,--gc-sections -nostdlib -lc -lm -ldl -llog -lgcc -Wl,--no-undefined,-z,nocopyreloc -Wl,-dynamic-linker,/system/bin/linker -L$NDK/out/target/product/generic/obj/lib/" 
export CFLAGS="-fno-exceptions -Wno-multichar -mthumb -mthumb-interwork -nostdlib -lc -ldl -lm -march=armv5te -mtune=xscale -msoft-float -mandroid -fPIC -mthumb-interwork -mthumb -mlong-calls -ffunction-sections -fstack-protector -fno-short-enums -fomit-frame-pointer -fno-strict-aliasing -finline-limit=64 -D__ARM_ARCH_5__ -D__ARM_ARCH_5T__ -D__ARM_ARCH_5E__ -D__ARM_ARCH_5TE__ -DANDROID -DOS_ANDROID -D__NEW__ -D__SGI_STL_INTERNAL_PAIR_H -I$SYSROOT/usr/include -I $A/system/core/include -I $NDKLIBS" 

./configure --host=arm-eabi --with-ssl=$A/external/openssl 

` Y el resumen de salida es la siguiente:

configure: Configurado para construir rizo/libcurl:

curl version:  7.26.0 
    Host setup:  arm-unknown-eabi 
    Install prefix: /usr/local 
    Compiler:   /home/tanco/Development/AOSP/2.3.3/prebuilt/linux-x86/toolchain/arm-eabi-4.2.1/bin/arm-eabi-gcc 
    SSL support:  no  (--with-{ssl,gnutls,nss,polarssl,cyassl,axtls}) 
    SSH support:  no  (--with-libssh2) 
    zlib support:  enabled 
    krb4 support:  no  (--with-krb4*) 
    GSSAPI 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) 
    Build libcurl: Shared=no, 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: /etc/ssl/certs/ca-certificates.crt 
    ca cert path:  no 
    LDAP support:  no  (--enable-ldap/--with-ldap-lib/--with-lber-lib) 
    LDAPS support: no  (--enable-ldaps) 
    RTSP support:  enabled 
    RTMP support:  no  (--with-librtmp) 
    Protocols:  DICT FILE FTP GOPHER HTTP IMAP POP3 RTSP SMTP TELNET TFTP 

    SONAME bump:  yes - WARNING: this library will be built with the SONAME 
        number bumped due to (a detected) ABI breakage. 
        See lib/README.curl_off_t for details on this. 

Primera extraña cosa que viene a la mente es por qué SSL no está incluido en la configuración ya que el enlazador muestra la lib intermedia Se llama a s y ssl flag, pero después cuando uso el mismo archivo curl_config.h en el proyecto jni que creé para la compilación (dado que tiene un archivo Android.mk independiente, se puede compilar simplemente descomprimiendo en la carpeta jni de un proyecto androide, copiar el archivo de configuración creado en la fuente AOSP y llamando NDK-build)

así que compilar y me sale:

$ ndk-build 
Compile thumb : curl <= url.c 
In file included from /Projects/temp/testNDK/jni/lib/url.c:32:0: 
/Tools/sdk/android/ndk/platforms/android-14/arch-arm/usr/include/unistd.h: In function 'getpagesize': 
/Tools/sdk/android/ndk/platforms/android-14/arch-arm/usr/include/unistd.h:171:3: warning: nested extern declaration of '__page_size' [-Wnested-externs] 
/Tools/sdk/android/ndk/platforms/android-14/arch-arm/usr/include/unistd.h: In function '__getpageshift': 
/Tools/sdk/android/ndk/platforms/android-14/arch-arm/usr/include/unistd.h:175:3: warning: nested extern declaration of '__page_shift' [-Wnested-externs] 
/Projects/temp/testNDK/jni/lib/url.c: At top level: 
/Projects/temp/testNDK/jni/lib/url.c:57:2: error: #error "We can't compile without socket() support!" 
make: *** [/Projects/temp/testNDK/obj/local/armeabi/objs/curl/lib/url.o] Error 1 

Respuesta

13

Aquí está la solución, actualizado para NDK8c

paso cero: descargar y corregir el Android NDK No sé cómo pero th e ndk tiene un defecto muy interesante, que (en mi opinión) no le permite compilar muchas cosas, así que para poder compilar OpenSSL necesita hacer una pequeña corrección, extraer el ndk8c donde quiera que guarde sus herramientas, y a continuación, editar el archivo: android-NDK-R8C/build/GMSL/__ GMSL línea 512: cambio de línea

int_encode = $(__gmsl_tr1)$(wordlist 1,$1,$(__gmsl_input_int)) 

con la línea

int_encode = $(__gmsl_tr1)$(wordlist 1,$(words $1),$(__gmsl_input_int)) 

y ya está bueno para ir!

paso uno: Descargar y compilar OpenSSL para Android: compilar una versión portado encontró here o Descargar el funcionario 1.0.0c versión de OpenSSL y luego compilarlo para android con el manual previsto en el github he vinculado para la versión compatible con Android

Así que el siguiente paso es conseguir que el libssl.so y libcrypto.so y poner la en la carpeta NDK para facilitar el acceso, por lo que copiarlos de

openssl-folder/libs/armeabi/ 

a

android-ndk-r8c/platforms/android-8/arch-arm/usr/lib 

esta manera al compilar yo u puede incluir las librerias usando un modificador de vinculador sencilla -lssl -lcrypto

Paso dos: obtener la última fuente de enrollamiento por here

Abrir el archivo en Docs/instalar y siga los pasos necesarios para hacer que la cadena de herramientas independiente y poner en su carpeta deseada, y luego la parte difícil, necesitaba código fuente que ha de android para la configuración de continuar, a pesar de que tengo un openssl compilado independiente puede incluir los archivos de cabecera de allí también, en anycase este es el más complicado versión para que elijas lo que haces, no elegí evadirlos para que puedas ir al Google AOSP site y seguir los pasos para comprar ld e inicializa el ambiente.

por lo que sería algo así como:

1.download,

  1. ir a la raíz del código fuente y ejecutar:

    ~: construir/envsetup.sh; almuerzo 1; hacer;

Así que finalmente tenemos que compilar rizo con soporte SSL, por lo que,

Paso tres

extracto de rizo a la carpeta deseada (tengo un deseo específico de desactivar todo excepto http/s para mantener la biblioteca lo más pequeño posible significado acerca de ~ 300k, si quieres más protocolos en su lib, retire la --disable-protocolo para el protocolo deseado) ejecute el siguiente:

make clean 

export PATH=/opt/arm-linux-androideabi-4.4.3/bin:$PATH 

export LDFLAGS="\ 
-lssl \ 
-lcrypto \ 
-L/home/user/Development/Tools/sdk/android/ndk/platforms/android-8/arch-arm/usr/lib" 

export CFLAGS="\ 
-I/home/user/Development/AOSP/2.3.7/system/core/include \ 
-I/home/user/Development/Tools/sdk/android/ndk/platforms/android-8/arch-arm/usr/include" 

./configure --host=arm-linux-androideabi \ 
--with-ssl=/home/user/Development/Projects/portingLibs/openssl-android-master \ 
--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 


make 



Note that in the block above, if you don't want to use the AOSP source, you could switch 

-I/home/user/Development/AOSP/2.3.7/system/core/include \ 

with the include folder for your ssl distribution. 

Así que finalmente tiene: estática:

curl-7.28.1/lib/.libs/libcurl.a 

y compartido:

curl-7.28.1/lib/.libs/libcurl.so.5.3 

Así que es eso .. tomar el archivo, y compilar distancia :)

+0

Muchas gracias por su trabajo. He seguido tu consejo, pero en lugar de utilizar el SDK completo, solo utilicé la cadena de caracteres independiente tal como se indicó en la guía de instalación de CURL. Luego copié los encabezados de openssl y los archivos .so en las carpetas de la cadena de herramientas y configuré LDFLAGS y CPPFLAGS respectivamente. Un simple --with-ssl hizo el truco, una vez configurado correctamente. Por lo tanto, para referencia futura: no tiene que usar el SDK completo de Android, la cadena de herramientas también es una posible forma. – domenukk

+0

ese es el caso ahora, hace dos años o más no era compilable fuera de AOSP – Tancho

+0

Tuve que modificar los comandos aquí a http://pastebin.com/qzxzc592 no estoy seguro si eso es necesario para todos, aunque – ruler501

0

Pasos para compilar libcurl.so con soporte SSL para JNI androide podría ser encontrado aquí: http://ieroot.com/2015/03/29/1728.html

Luché durante una semana para descubrirlo.

preguntar si alguna pregunta.Voy a responder lo antes posible.

+0

El enlace no funciona – Tancho

+0

Lo he intentado justo ahora y creo que funciona. Tal vez, debes intentarlo de nuevo. Contáctame si todavía no puedes conectarte. –

1

Me gusta la forma de utilizar Docker para construir tales libs estáticas. Aquí hay una secuencia de comandos completa: solo ejecuta y toma el resultado. Muestra: https://gist.github.com/VictorLaskin/1c45245d4cdeab033956

Tal guión te:

  • compilación configuración herramientas/utils descarga SDK/NDK
  • crear imágenes transversales de la compilación del código fuente personalizada cadena de herramientas de descarga de librerías (zlib, openssl, enrollamiento)
  • configuración del entorno de instalación para compilación cruzada
  • configurar y crear libs
  • recopilar salida en una carpeta y crear la forma de obtener compiled libs

Esta versión específica está utilizando la última NDK 10e y clang toolchain.

hay post con más detalles aquí: http://vitiy.info/dockerfile-example-to-compile-libcurl-for-android-inside-docker-container/

espero que esto ayude a alguien a no perder un tiempo precioso.