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.
- Protocolos SSL / TLS y suites de cifrado con AndroidHttpClient
- Cómo utilizar OpenSSL Library en la aplicación ANDROID
- Comprobación de la firma del servidor de compras de Android en la aplicación mediante php OpenSSL
- Servidor local HTTPS en Android con autenticación de cliente
- Autenticación SSL de dos vías en android
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!
- Error de protocolo desconocido con conexión HTTPS en android
- Javax.crypto.Cipher trabajando de forma diferente desde Android 6 Marshmallow
- Actualizar la aplicación de Android a la versión más reciente de OpenSSL
- Android ssl: javax.net.ssl.SSLPeerUnverifiedException: Ningún certificado de igual (una vez más)
- Verificación de la firma de compra en la aplicación con PHP openssl
- ¿Cómo construir OpenSSL como biblioteca compartida no versionada para Android?
- No se puede localizar el símbolo 'tcgetattr' referido por "libcrypto.so"
- Mensaje de advertencia de Google Play y OpenSSL
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,
-
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.
- ¿Es posible definir el comportamiento / el diseño del widget para cambiar el tamaño y el cambio de orientación en los lanzadores de terceros?
- Intent.ACTION no marca después del primer signo #