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..
Pour pouvoir suivre ce tutoriel, vous aurez besoin des éléments suivants:
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:
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..
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:
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.
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:
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!