Comment débuter avec le kit de développement natif d'Android

Avec le lancement d'Android Studio 2.2, le développement d'applications Android contenant du code C ++ est devenu plus facile que jamais. Dans ce tutoriel, je vais vous montrer comment utiliser le Kit de développement natif Android, généralement appelé simplement NDK, pour créer une bibliothèque C ++ native dont les fonctions sont disponibles pour les classes Java..

Conditions préalables

Pour pouvoir suivre ce tutoriel, vous aurez besoin des éléments suivants:

  • la dernière version d'Android Studio
  • une compréhension de base de la syntaxe C ++

1. Pourquoi écrire du code natif?

En règle générale, vous développez une application Android en utilisant uniquement Java. L'ajout de code C ++ augmente considérablement sa complexité et réduit également sa portabilité. Néanmoins, voici quelques raisons pour lesquelles vous voudriez toujours le faire:

  • Pour maximiser les performances: Vous pouvez améliorer les performances d'une application Android, même si ce n'est que de manière marginale, en implémentant en C les parties gourmandes en CPU de sa logique métier++.
  • Pour utiliser des API hautes performances: Les implémentations de spécifications API telles que Vulkan Graphics et OpenSL ES font partie du NDK. Par conséquent, les développeurs de jeux Android ont tendance à utiliser le NDK.
  • Pour utiliser les bibliothèques C / C ++ populaires: Il existe de nombreuses bibliothèques C et C ++ qui n’ont pas d’équivalent Java. Si vous voulez travailler avec eux dans votre application Android, utilisez le NDK..
  • Pour réutiliser du code: Tant qu'il ne contient aucune dépendance spécifique à la plate-forme, le code écrit en C ++ peut être utilisé dans les applications Android et iOS, généralement avec des modifications minimes. Si vous développez une application volumineuse et souhaitez prendre en charge les plates-formes iOS et Android, l'utilisation de C ++ peut améliorer votre productivité..

2. Créer un nouveau projet

Dans Android Studio 2.2 ou version ultérieure, l’assistant de création de projet vous permet de créer rapidement de nouveaux projets prenant en charge le code C ++..

Commencez par lancer Android Studio et appuyez sur le bouton Démarrer un nouveau projet Android Studio bouton dans l'écran d'accueil. Dans l’écran suivant, attribuez un nom explicite à votre application et cochez la case correspondante. Inclure le support C ++ champ.

Dans l'écran de création d'activité de l'assistant, choisissez le Ajouter aucune activité option. Dans l’écran final de l’assistant, assurez-vous que la valeur de C ++ Standard le champ est défini sur Toolchain par défaut et appuyez sur le terminer bouton.

Le NDK Android et les outils dont il dépend ne sont pas installés par défaut. Par conséquent, une fois le projet généré, vous verrez une erreur qui ressemble à ceci:

Pour corriger l'erreur, allez à Outils> Android> Gestionnaire de SDK et passer à la Outils SDK languette.

Dans la liste des outils de développement disponibles, sélectionnez les deux CMake et NDK, et appuyez sur le Appliquer bouton.

Une fois l'installation terminée, redémarrez Android Studio..

3. Créer une bibliothèque native

Un projet Android Studio prenant en charge C ++ possède un répertoire de code source supplémentaire appelé cpp. Comme vous l'avez peut-être deviné, tous les fichiers et bibliothèques C ++ doivent y être placés. Par défaut, le répertoire contient un fichier appelé native-lib.cpp. Pour l'instant, nous allons écrire tout notre code C ++ à l'intérieur.

Dans ce tutoriel, nous allons créer une bibliothèque native simple contenant une fonction qui calcule l’aire d’un cercle à l’aide de la formule πr². La fonction acceptera le rayon du cercle en tant que jdouble et retourner la zone en tant que Jstring.

Commencez par ajouter ce qui suit comprendre directives au fichier:

#comprendre  #comprendre  #comprendre 

jni.h est un fichier d’en-tête contenant plusieurs définitions de macros, types, structures et fonctions, indispensables pour travailler avec NDK. (JNI signifie Java Native Interface, et c’est le cadre qui permet à Java Runtime de communiquer avec du code natif.) chaîne fichier d'en-tête est nécessaire parce que nous allons utiliser le Jstring tapez dans notre bibliothèque. le math.h le fichier d'en-tête contient la valeur de π.

Par défaut, afin de prendre en charge le polymorphisme, le compilateur C ++ modifie les noms de toutes les fonctions que vous définissez dans votre code. Cette fonctionnalité est souvent appelée nom malpropre. En raison du nom mal choisi, appeler vos fonctions C ++ à partir de code Java entraînera des erreurs. Pour éviter les erreurs, vous pouvez désactiver le changement de nom en définissant vos fonctions dans un extern "C" bloc.

extern "C" // Vos fonctions doivent être définies // ici

Les noms des fonctions C ++ accessibles via JNI doivent avoir le format suivant:

  • Ils doivent avoir un Java_ préfixe.
  • Ils doivent contenir une forme mutilée du nom du paquet où les points sont remplacés par des traits de soulignement..
  • Ils doivent contenir le nom de la classe Java à laquelle ils appartiennent.

De plus, vous devez spécifier la visibilité de la fonction. Vous pouvez le faire en utilisant le JNIEXPORT macro. Par convention, la plupart des développeurs incluent également le JNICALL macro dans la définition de la fonction, bien qu’elle ne serve actuellement à rien dans Android.

Le code suivant définit une fonction appelée surface de calcul, qui peut être accessible à partir d'une classe Java appelée Activité principale:

JNIEXPORT jstring JNICALL Java_com_tutsplus_mynativeapplication_MainActivity_calculateArea (JNIEnv * jenv, travail propre, jdouble rayon) 

Notez qu’outre le rayon, la fonction accepte également un JNIEnv type, qui a des fonctions utilitaires que vous pouvez utiliser pour gérer les types Java, et un jobject instance, qui est une référence à une instance de Activité principale. Nous allons bien sûr créer Activité principale plus tard dans ce tutoriel.

Calculer la surface est facile. Tout ce que vous devez faire est de multiplier le M_PI macro par le carré de la rayon.

jdouble aire = M_PI * rayon * rayon;

Pour que vous sachiez comment gérer les chaînes lorsque vous travaillez avec JNI, créons maintenant une nouvelle chaîne contenant un message indiquant la zone. Pour ce faire, vous pouvez utiliser le sprintf () une fonction.

sortie de charbon [40]; sprintf (sortie, "La surface est% f sqm", surface);

Java ne pouvant pas gérer directement un tableau de caractères C ++, le type de retour de notre fonction est Jstring. Pour convertir le sortie tableau dans un Jstring objet, vous devez utiliser le NewStringUTF () une fonction.

return jenv> NewStringUTF (sortie);

À ce stade, notre code C ++ est prêt.

4. Utilisation de la bibliothèque native

A l'étape précédente, vous avez vu que le CalculateArea () la fonction doit appartenir à la Activité principale Classe Java. Commencez à créer la classe en cliquant avec le bouton droit sur le nom de votre package Java et en sélectionnant Fichier> Nouveau> Activité vide.

Dans la boîte de dialogue qui apparaît, attribuez un nom à l'activité. Activité principale. Après s’être assuré que le Activité du lanceur L’option est cochée, appuyez sur le bouton terminer bouton.

La bibliothèque native doit être chargée avant de pouvoir être utilisée. Par conséquent, ajoutez un statique bloquer à la classe et charger la bibliothèque en utilisant le loadLibrary () méthode du Système classe.

static System.loadLibrary ("native-lib"); 

Pour pouvoir utiliser le CalculateArea () C ++ dans l’activité, vous devez la déclarer en tant que originaire de méthode.

chaîne native native CalculateArea (double rayon);

Vous pouvez maintenant utiliser le CalculateArea () méthode comme toute méthode Java ordinaire. Par exemple, vous pouvez ajouter le code suivant à la onCreate () méthode pour calculer et imprimer l'aire du cercle dont le rayon est 5.5:

Log.d (TAG, CalculateArea (5.5f));

Si vous exécutez l'application, vous devriez pouvoir voir la sortie suivante dans logcat la fenêtre:

Conclusion

Dans ce tutoriel, vous avez appris à créer une bibliothèque C ++ native et à l'utiliser dans une application Android. Il est à noter que le processus de construction natif génère, par défaut, un fichier séparé. .alors fichier pour chaque architecture de processeur prise en charge par le NDK. Par conséquent, vous pouvez être sûr que votre application fonctionnera sur la plupart des appareils Android sans aucun problème..

Pour en savoir plus sur le NDK Android, je vous suggère de vous reporter au Guide NDK..

Et découvrez certains de nos autres tutoriels et cours sur le développement Android!

  • Audio de fond dans Android avec MediaSessionCompat

    L'une des utilisations les plus courantes pour les appareils mobiles est la lecture audio via des services de diffusion de musique en continu, des podcasts téléchargés, etc.
    Paul Trebilcox-Ruiz
    SDK Android
  • Prenez des photos avec votre application Android

    Le Google Play Store propose des dizaines d'applications pour appareils photo, chacune permettant une manière différente de prendre des photos ou de faire quelque chose d'unique avec les photos du…
    Ashraff Hathibelagal
    SDK Android