L'intégration libsodium sur Android

J'essaie d'intégrer la bibliothèque libsodium sur le projet Android. J'utilise Android Studio (0.5.8) avec gradle (0.9) et les outils de construction Android (19.1). J'ai compilé libsodium avec des scripts qui peuvent être trouvés dans la bibliothèque. Je reçois quatre bibliothèques préBuild (.so files) pour différentes architectures (bras, bras-v7a, mips & x86). J'ai mis ces fichiers dans le dossier jniLibs. Je déclare dans mon fichier build.gradle que j'utilise NDK et configure le chemin d'accès au fichier local.properties.

Dans cette version de gradle, il n'est pas nécessaire d'écrire un makefile ( http://ph0b.com/android-studio-gradle-and-ndk-integration/ )

  • Rx Java mergeDelayError ne fonctionne pas comme prévu
  • Pourquoi MediaStore.Audio.Albums.EXTERNAL_CONTENT_URI ne fournit-il pas un "Album Artiste" précis?
  • Meilleur endroit pour stocker les identifiants de connexion utilisateur dans Android
  • Gradle: comment puis-je inclure un jar local à partir d'un projet java dépendant dans une version Android?
  • Qu'est-ce que Google Web Driver dans Android SDK Manager?
  • ExpandableListView avec plusieurs choix enregistrer l'élément sélectionné dans un tableau
  • Je déclare certaines fonctions natives dans mon activité après avoir effectué un appel statique:

    static { System.loadLibrary("sodium"); } public final static native String sodium_version_string(); onCreate() { ... Log.d(getClass().getName(), "Sodium version:" + sodium_version_string()); } 

    La sortie de Logcat est:

     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) 

    Est-ce que j'ai manqué de déclarer quelque chose dans un autre fichier? Est-ce vraiment nécessaire kalium-JNI? Comment cette lib peut-elle être incluse dans le projet?

    Merci.

  • L'application Android et l'écran de verrouillage de motif
  • Android ne réagit pas natif
  • Cause pour NullPointerException android.support.v7.widget.RecyclerView.onMeasure
  • Comment annuler Handler dans le code?
  • Quelle est la signification de la nouvelle annotation @SystemApi, une différence par rapport à @hide?
  • Est-il possible d'utiliser Mozilla Persona (BrowserID) avec des applications mobiles?
  • One Solution collect form web for “L'intégration libsodium sur Android”

    À l'heure actuelle, votre code Java n'a aucun moyen de savoir comment utiliser votre bibliothèque native. Vous devez faire la partie JNI, soit en utilisant Kalium-JNI, soit en mettant en œuvre uniquement les pièces dont vous avez besoin.

    Dans le cas de sodium_version_string() , cela devrait fonctionner:

     jstring java_com_example_myapplication2_app_MainActivity_sodium_version_string(JNIEnv* env, jclass cls) { return (env*)->NewStringUTF(env, sodium_version_string()); } 

    Ici, l'implémentation java_com_example_myapplication2_app_MainActivity_sodium_version_string sera automatiquement associée à votre static native String sodium_version_string() grâce à la convention JNI.

    Vous pouvez utiliser JNI_Onload() pour déclarer manuellement une telle association, mais vous devez toujours faire face à l'environnement JNI et aux objets dans les implémentations.

    coAndroid est un fan Android de Google, tout sur les téléphones Android, Android Wear, Android Dev et Android Games Apps.