android android-ndk openssl android-ndk-r7

openSSL usando los problemas NDK de Android



android-ndk android-ndk-r7 (2)

Tengo la siguiente situación, estoy portando una pieza de una aplicación usando OpenSSL para encriptación AES, tengo todo compilado, pero el enlazador falla. La situación es la siguiente: 1. Escribí un contenedor JNI que simplemente lo hace:

private native String cipherString(String plainData, int datasize, String password, int passSize); private native String decipherString(String cipheredData, int datasize, String password, int passSize);

A continuación tengo un archivo c ++ al que llamo JNI sintax que traduce jstring a char * y todas las demás transformaciones necesarias, y realiza una llamada a otro archivo cpp que realmente importa los encabezados openssl (presentes y contabilizados) y llama a los métodos openssl para cifrar y descifrar.

Entonces, cuando llamo a ndk-build, construye todos los pulgares, por lo que el compilador los compila correctamente. Luego necesitaba portar openssl para android, y usé este OpenSSL para Android que funciona como un char con un simple ndk-build (en la raíz del proyecto, por supuesto) y construye libssl.so y libcrypto.so

Así que necesito conectar los dos. Me resulta difícil conectar los scripts de compilación, de modo que un ndk-build compila y enlaza todo (agradecería un proyecto de ejemplo simple si alguien tiene el tiempo para hacerlo)

así que copié los archivos compilados libssl y libcrypto .so en jni / includes / prebuilt y quiero incluirlos en el proyecto para que el enlazador pueda finalmente crear la lib que usaré al final.

Tengo el siguiente archivo Android.mk

LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) include $(LOCAL_PATH)/includes/build/common.mk include $(LOCAL_PATH)/includes/build/common_includes.mk APP_STL := gnustl_static LOCAL_MODULE := packer LOCAL_SRC_FILES := modules/cipher/wrapper.cpp / ... #rest of the cpp code LOCAL_C_INCLUDES += $(LOCAL_PATH)/includes/openssl LOCAL_SHARED_LIBRARIES := $(LOCAL_PATH)/includes/precompiled/libssl.so / $(LOCAL_PATH)/includes/precompiled/libcrypto.so LOCAL_SHARED_MODULES := sslx cryptox include $(BUILD_SHARED_LIBRARY) LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) LOCAL_MODULE := sslx LOCAL_SRC_FILES := $(LOCAL_PATH)/includes/precompiled/libssh.so include $(PREBUILT_SHARED_LIBRARY) LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) LOCAL_MODULE := cryptox LOCAL_SRC_FILES := $(LOCAL_PATH)/includes/precompiled/libssh.so include $(PREBUILT_SHARED_LIBRARY)

Y cuando llamo a ndk-build obtengo un decepcionante

sslx: LOCAL_SRC_FILES points to a missing file. Check that /home/user/Development/Tools/sdk/android/ndk/build/core//home/user/Development/Tools/sdk/android/ndk/build/core/includes/precompiled/libssh.so exists or that its path is correct. Aborting . Stop.

como ya puede adivinar que la ruta es totalmente incorrecta, y lo que me confunde es que $ {LOCAL_PATH} devuelve la ruta correcta para el primer lote de includes y una completamente incorrecta para los archivos .so ... ¡Cualquier ayuda sería muy apreciada!


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 partir!

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 provisto en el github I linked 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 :)


@Tancho

Hice el cambio a la línea __gmsl: 512 que mencionaste. Si bien permitió que OpenSSL compilara, también rompe la construcción de ejecutables en $ (BUILD_EXECUTABLE). Antes del cambio, mi aplicación hello world simple se compila y ejecuta, pero después del cambio que compila, pero al ejecutarlo en mi Nexus resulta en un fallo seg.

Revertir el cambio y todo está bien de nuevo. No sé cómo arreglar esto, realmente no sé lo que hace esa línea, pero esto es solo una pequeña advertencia para cualquiera que haga ese cambio.