openSSL usando los problemas de NDK de Android

Tengo la siguiente situación, estoy portando un pedazo de una aplicación usando OpenSSL para el cifrado AES, tengo todo compilar, pero el enlazador falla. La situación es la siguiente: 1. Escribí una envoltura JNI que simplemente 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); 

Luego tengo un archivo c ++ que llamo que tiene la sintaxis JNI adecuada que traduce jstring a char * y todas las demás transformaciones necesarias, y hace una llamada a otro archivo cpp que realmente importa los encabezados de openssl (presentes y contabilizados) y llama a los métodos openssl para cifrar y descifrar.

Así que cuando llamo ndk-build, construye todos los pulgares, por lo que el compilador los compila correctamente. Luego necesitaba abrir 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 tengo que conectar los dos .. Me parece un reto para conectar los scripts de construcción, por lo que un ndk-build compila y enlaza todo (me gustaría un proyecto de ejemplo simple si alguien tiene el tiempo para ello)

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

Tengo el siguiente archivo de 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 ndk-build consigo una 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 se puede adivinar el camino es totalmente erróneo, y lo que me confunde es que $ {LOCAL_PATH} devuelve la ruta correcta para el primer lote de incluye y una completamente equivocada para los archivos. So … Cualquier ayuda sería muy apreciada!

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

paso cero : descargar y arreglar el Android NDK No sé cómo, pero el ndk tiene un defecto muy interesante, que (en mi opinión) no le permite compilar mucho de cosas, por lo que para poder compilar OpenSSL que necesita para hacer un small fix, extraiga el ndk8c donde quiera que mantenga sus herramientas, y luego edite el archivo: android-ndk-r8c / build / gmsl / __ gmsl línea 512: change line

 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 usted es bueno para ir!

paso uno : Descargar OpenSSL y compilar para Android: o compilar una versión publicada aquí o Descargar la versión oficial de 1.0.0c de OpenSSL y luego compilarlo para Android usando el manual proporcionado en el github que he vinculado a la versión compatible con Android

Así que el siguiente paso es obtener libssl.so y libcrypto.so y ponerlos en la carpeta NDK para un acceso fácil, así que copiarlos desde

 openssl-folder/libs/armeabi/ 

a

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

de esta manera al compilar puede incluir las libs utilizando un simple vinculador switch -lssl -lcrypto

Segundo paso : obtener la última fuente de Curl para aquí

Abra el archivo en Docs / INSTALL 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 que la configuración continúe, a pesar de que tengo un compilado autónomo openssl puedes incluir los archivos de cabecera desde allí también, en cualquier caso esta es la versión más complicada para que elijas lo que haces, no elijo evadirlos para que puedas ir al sitio de Google AOSP y recorrer los pasos para construir e inicializar el entorno.

por lo que sería algo así como:

1.descargar,

  1. vaya a la raíz del código fuente y ejecute:

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

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

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ño posible sobre ~ 300k, si desea más protocolos en su lib, elimine el protocolo – 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: static:

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

y compartida:

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

Así que eso es .. tomar el archivo, y compilar lejos 🙂

@Tancho

Hice el cambio a la línea __gmsl: 512 que usted mencionó. Aunque permitió a OpenSSL compilar, también rompe la construcción de ejecutables por $ (BUILD_EXECUTABLE). Antes del cambio, mi aplicación hello world compila y ejecuta, pero después del cambio compila pero ejecutarlo en mi Nexus resulta en una falla 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 sólo una pequeña advertencia a cualquiera que haga ese cambio.

  • ¿Cuál es el significado exacto de la versión de la plataforma Android NDK en comparación con el nivel API?
  • Cómo construir openssl en android
  • Cómo construir OpenSSL para generar libcrypto.a con Android NDK y Windows
  • Compilación de la última versión de OpenSSL para Android
  • Descifrar Android SSE con OpenSSL
  • Transferencia PrivateKey de KeyStore, uso en OpenSSL con JNI
  • Construir Android openssl usando NDK no hace los archivos de ensamblaje arm4 correctamente
  • Error en la autenticación mutua en Android con javax.net.ssl.SSLHandshakeException: El apretón de manos falló
  • CertificateException - OpenSSLX509CertificateFactory $ ParsingException
  • Mostrar certificado de Android
  • Utilice la función PHP openssl_verify () para verificar Firma y datos creados por Android Client APP
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.