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,
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.