Integración de libsodium en android
Estoy tratando de integrar libsodium biblioteca en el proyecto de Android. Estoy usando Android Studio (0.5.8) con gradle (0.9) y herramientas de compilación android (19.1). He compilado libsodium con scripts que se pueden encontrar en la biblioteca. Tengo cuatro libras preBuild (archivos .so) para diferentes arquitecturas (brazo, brazo-v7a, mips y x86). Pongo estos archivos dentro de la carpeta jniLibs. Declaro en mi archivo build.gradle que estoy usando NDK y configuro la ruta en el archivo local.properties.
En esta versión de gradle, no es necesario escribir un makefile ( http://ph0b.com/android-studio-gradle-and-ndk-integration/ )
- Utilizar una clase simple de C ++ en Android NDK
- Cómo escalar de manera eficiente el marco de vídeo usando NDK
- Cómo utilizar android ndk para acceder a la cámara
- NDK-enlazar una biblioteca en otra biblioteca "No se puede cargar la biblioteca: link_image : 1765 no se pudo cargar la biblioteca necesaria ..."
- ¿Cómo terminar la aplicación de NDK (actividad nativa) de android mediante programación?
Declaro algunas funciones nativas en mi actividad después de hacer una llamada estática:
static { System.loadLibrary("sodium"); } public final static native String sodium_version_string(); onCreate() { ... Log.d(getClass().getName(), "Sodium version:" + sodium_version_string()); }
La salida de Logcat es:
05-29 23:14:10.538 481-1569/system_process I/ActivityManager﹕ Start proc com.example.myapplication2.app.x86 for activity com.example.myapplication2.app.x86/com.example.myapplication2.app.MainActivity: pid=1584 uid=10056 gids={50056, 1028} 05-29 23:14:10.554 1584-1584/com.example.myapplication2.app.x86 D/dalvikvm﹕ Trying to load lib /data/app-lib/com.example.myapplication2.app.x86-2/libsodium.so 0xa4ed8520 05-29 23:14:10.562 1584-1584/com.example.myapplication2.app.x86 D/dalvikvm﹕ Added shared lib /data/app-lib/com.example.myapplication2.app.x86-2/libsodium.so 0xa4ed8520 05-29 23:14:10.562 1584-1584/com.example.myapplication2.app.x86 D/dalvikvm﹕ No JNI_OnLoad found in /data/app-lib/com.example.myapplication2.app.x86-2/libsodium.so 0xa4ed8520, skipping init 05-29 23:14:10.578 1584-1584/com.example.myapplication2.app.x86 W/dalvikvm﹕ No implementation found for native Lcom/example/myapplication2/app/MainActivity;.sodium_version_string:()Ljava/lang/String; 05-29 23:14:10.578 1584-1584/com.example.myapplication2.app.x86 D/AndroidRuntime﹕ Shutting down VM 05-29 23:14:10.578 1584-1584/com.example.myapplication2.app.x86 W/dalvikvm﹕ threadid=1: thread exiting with uncaught exception (group=0xa4c46648) 05-29 23:14:10.578 1584-1584/com.example.myapplication2.app.x86 E/AndroidRuntime﹕ FATAL EXCEPTION: main java.lang.UnsatisfiedLinkError: Native method not found: com.example.myapplication2.app.MainActivity.sodium_version_string:()Ljava/lang/String; at com.example.myapplication2.app.MainActivity.sodium_version_string(Native Method) at com.example.myapplication2.app.MainActivity.onCreate(MainActivity.java:28)
¿He dejado de declarar algo en otro archivo? ¿Es realmente necesario kalium-JNI? ¿Cómo se puede incluir esta lib en el proyecto?
Gracias.
- Configuración de C ++ 11 (std :: thread) para NDK con ADT / Eclipse
- Cómo construir OpenSSL para generar libcrypto.a con Android NDK y Windows
- ¿Cómo puedo publicar código para ser ejecutado en el hilo principal de Android de un hilo separado en C + +?
- Generar archivo .so en Android Studio
- Android: Necesidad de crear un objeto Preferencias compartidas en c ++ NDK y almacenar algún valor booleano
- Android NDK ventajas y desventajas
- Android NDK - intente capturar con NoMemoryError
- Protección de integridad de la biblioteca compartida de Android
En este momento tu código Java no tiene forma de saber cómo usar tu biblioteca nativa. Necesita hacer la parte JNI, ya sea utilizando Kalium-JNI o implementando sólo las partes que necesita.
En el caso de sodium_version_string()
, esto debería funcionar:
jstring java_com_example_myapplication2_app_MainActivity_sodium_version_string(JNIEnv* env, jclass cls) { return (env*)->NewStringUTF(env, sodium_version_string()); }
Aquí la implementación de java_com_example_myapplication2_app_MainActivity_sodium_version_string
se asociará automáticamente a la static native String sodium_version_string()
gracias a la convención JNI.
En lugar de ello, puede utilizar JNI_Onload()
para declarar manualmente dicha asociación, pero todavía necesita ocuparse del entorno JNI y de los objetos dentro de las implementaciones.