android libcurl porting android-ndk

portar libcurl en android con soporte ssl



porting android-ndk (3)

Aquí está la solución, actualizada a NDK8c

paso cero : descarga y arregla el NDK de Android. No sé cómo pero el ndk tiene un defecto muy interesante, que (en mi opinión) no te permite compilar muchas cosas, así que para poder compilar OpenSSL necesitas hacer un pequeña solución, extraiga el ndk8c donde quiera que guarde sus herramientas, y luego edite el archivo: android-ndk-r8c / build / gmsl / __ gmsl línea 512: cambie de línea

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

con línea

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

¡Y estás listo para ir!

paso uno : descargue OpenSSL y compile para Android: compile una versión portada que se encuentra aquí o descargue la versión oficial 1.0.0c de OpenSSL y luego compílela para android utilizando el manual proporcionado en el github que he vinculado para la versión compatible con Android

El próximo paso es obtener libssl.so y libcrypto.so y ponerlos en la carpeta NDK para facilitar el acceso, así que cópielos de

openssl-folder/libs/armeabi/

a

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

De esta forma, al compilar puede incluir las librerías utilizando un simple conmutador de enlazador -lssl -lcrypto

Paso dos : obtenga la última fuente de Curl aquí

Abra el archivo en Documentos / INSTALAR y siga los pasos necesarios para hacer la cadena de herramientas independiente y poner en la carpeta deseada, y luego la parte difícil, necesitaba tener el código fuente de Android para la configuración para continuar, aunque tengo una compilación independiente openssl puede incluir también los archivos de encabezado, en cualquier caso esta es la versión más complicada para que elija lo que hace, no elegí evadirlos para que pueda ir al sitio de Google AOSP y seguir los pasos para compilar e inicializar el entorno.

entonces sería algo así como:

1. descarga,

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

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

Finalmente, necesitamos compilar curl con soporte SSL, entonces,

Paso tres

extraer curl a la carpeta deseada (Tengo un deseo específico de desactivar todo excepto http / s para mantener la biblioteca lo más pequeña posible, lo que significa aproximadamente ~ 300k, si quieres más protocolos en tu lib, elimina el --disable-protocol para el protocolo deseado) ejecute lo 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 tienes: estático:

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

y compartido:

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

Entonces eso es todo ... toma el archivo y compila :)

Intento portar libCurl a Android con soporte SSL, el paso uno sería portar el rizo sin soporte SSL, supongo, así que comencé a hacerlo. pero me encuentro con un problema.

como lo leí en el sitio web de desarrollo y en el archivo Android.mk, la parte difícil es configurar el make primero. entonces lo que hice fue:

  1. Descargue el código fuente de Android (y compílelo, ya que se necesitan algunas de las librerías intermedias)

  2. Descargar cURL

  3. desempaquetar curl debajo: {android_src} / external / curl

  4. crea el script de configuración 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 este:

configure: Configurado para construir curl / 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.

Lo primero que me viene a la mente es por qué SSL no está incluido en la configuración ya que el enlazador muestra las libs intermedias y se llama a la bandera de soporte ssl, 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 de Android, copiando el archivo de configuración creado en la fuente AOSP y llamando a ndk-build)

entonces compilo y obtengo:

$ 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


Los pasos para compilar libcurl.so con soporte ssl para android jni se pueden encontrar aquí: http://ieroot.com/2015/03/29/1728.html

Luché por una semana para descifrarlo.

Pregunte si tiene alguna pregunta. Voy a responder lo antes posible.


Me gusta la forma de usar Docker para compilar 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 script hará:

  • herramientas de compilación de configuración / utils descarga sdk / ndk
  • crear código fuente de descarga de herramientas de compilación cruzada personalizado para libs (zlib, openssl, curl)
  • configuración del entorno de configuración para la compilación cruzada
  • configurar y hacer libs
  • reunir salida en una carpeta y crear la forma de obtener librerías compiladas

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

Hay una publicación 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.