Utiliser NDK dans un projet Android Introduction NDK est une suite d’outils permettant de compiler puis d’utiliser du code natif dans une application Android. Ce code natif est ensuite appelé via JNI (Java Native Interface), fournissant des structures en C/C++ compatibles avec les types en Java. Les cas d’utilisations sont variés : Accès à des librairies sans passer par des classes intermédiaires. Utiliser moins de mémoire Besoin de ressources nécessitant un calcul relativement long (un rendu 3D) Installation Télécharger le ndk zip pour windows(ou linux/mac) à l’adresse http://developer.android.com/tools/sdk/ndk/index.html Ce dossier nous permettra d’utiliser les fonctionnalités suivantes sur notre projet : Cross compilation de librairies écrit en c/c++ Gestion des fichiers c/c++compilés pour l’intégration dans une apk Liste de header stables pour chaque version du sdk Le développement natif présente donc des avantages mais également des inconvénients non négligeables : Mistra Formation - 19 rue Béranger 75003 Paris - Métro République - 01 82 52 25 25 - [email protected] Utiliser NDK dans un projet Android Il renforce la complexité de vos programmes La compilation se fait sur une architecture bien précise (donc il faut compiler autant de fois que l’on a d’architecture de disponible : arm, mips, x86) Cas particulier sur windows Android étant un système basé sur unix (linux), nous devons donc installer un environnement similaire pour la compilation. (Linux ou mac). Sur windows nous choisissons cygwin. Cygwin est un outil permettant d’utiliser des commandes et des programmes unix sur un environnementbasé sur Windows. http://cygwin.com/ install.html Telecharger le fichier setup.exe et l’installation se fera depuis une connexion internet. Choisir gcc et make puis d’autres dépendances gcc gcc-core gcc-g++ gcc-mingw gcc-mingw-g++ mingw-runtime make Mistra Formation - 19 rue Béranger 75003 Paris - Métro République - 01 82 52 25 25 - [email protected] Utiliser NDK dans un projet Android Mistra Formation - 19 rue Béranger 75003 Paris - Métro République - 01 82 52 25 25 - [email protected] Utiliser NDK dans un projet Android Principe d’utilisation En plus du code c/c++ à écrire et à recompiler, nous devons créer une classe java interfaçant les méthodes natives (en c) avec l’utilisation de l’instruction « native» A la compilation, le code c/c++sera transformé en module dynamique .so (fichier commençant par lib et d’extension .so) ou statique (d’extension .a) ADT nous fourni dès a présent un plugin pour utiliser le NDK. Il fourni une génération automatique des bons fichiers de configuration et une compilation automatisé via des icones. Mistra Formation - 19 rue Béranger 75003 Paris - Métro République - 01 82 52 25 25 - [email protected] Utiliser NDK dans un projet Android Mistra Formation - 19 rue Béranger 75003 Paris - Métro République - 01 82 52 25 25 - [email protected] Utiliser NDK dans un projet Android Ensuite dans éclipse il faudra donner le chemin du répertoire de décompression du ndk dans: Window->preferences->android -> NDK Ce plugin nous permet de transformer un projet android classique en un projet intégrant des sources natives (c/c++) a l’aide d’un click droit sur le projet. Attention cependant, au moment de la création du projet, il faut absolument que la version minimale du projet soit identique à la version qui sera utilisée pour compiler, car les header fourni par le NDK seront différents pour chaque version de l’api courante. Mistra Formation - 19 rue Béranger 75003 Paris - Métro République - 01 82 52 25 25 - [email protected] Utiliser NDK dans un projet Android Mistra Formation - 19 rue Béranger 75003 Paris - Métro République - 01 82 52 25 25 - [email protected] Utiliser NDK dans un projet Android Toutes les sources c/c++ à compiler doivent être placé dans répertoire jni. Par défaut éclipse nous a généré un fichier «Android.mk » qui nous servira pour la compilation des fichiers natifs. Voici ce qu’il contient Mistra Formation - 19 rue Béranger 75003 Paris - Métro République - 01 82 52 25 25 - [email protected] Utiliser NDK dans un projet Android Les variables en bleu sont des variables locales utilisées pour la compilation. LOCAL_PATH est simplement le répertoire de compilation LOCAL_MODULE représente la liste des modules à créer après compilation. LOCAL_SRC_FILES représente la liste des fichiers à compiler Les variables en vert représentent des macros situées dans le répertoire build du Ndk et assurent les traitements nécessaires à la compilation. callmy-dir va indiquer au compilateur que le répertoire racine sera le répertoire où sera stocké ce makefile. CLEAR_VARS réinitialise toute les variables en bleu commençant par LOCAL_* BUILD_SHARE_LIBRARY construira les fichiers .so. Pour compiler, il suffit de faire un click droit sur le projet puis un build all De nouveaux fichiers apparaissent dans le dossier libs Mistra Formation - 19 rue Béranger 75003 Paris - Métro République - 01 82 52 25 25 - [email protected] Utiliser NDK dans un projet Android Nous remarquons que le fichier est automatiquement préfixé par lib et qu’il n’est seulement compilable pour arm. Afin de le rendre compilable pour toute architecture, nous pouvons créer un fichier Application.mk dans le répertoire jni avec le contenu suivant : Mistra Formation - 19 rue Béranger 75003 Paris - Métro République - 01 82 52 25 25 - [email protected] Utiliser NDK dans un projet Android Relancez la compilation et vous devriez avoir 3 dossiers supplémentaires : Ecriture d’un exemple java simple Dans le code java, nous pouvons écrire une classe accédant aux fonctions natives. Il suffit de charger la librairie de manière static puis déclarer les fonctions natives avec le mot clé « native ». Dans cet exemple, nous chargeons la librairie (.so) sans le préfixe lib, puis nous déclarons une fonction stringFromJNI et une autre fonction addition avec des paramètres, que l’on redéfinira plus tard dans le code c/c++. Mistra Formation - 19 rue Béranger 75003 Paris - Métro République - 01 82 52 25 25 - [email protected] Utiliser NDK dans un projet Android Ecriture d’un exemple c++ simple Jni interface la fonction c selon le pattern suivant: JNITypeJava_package_classname_nativemethod(JNIEnv* env, jobjectobj); JNIType le type de retour de la méthode qui va être un type interface jni (ex jint pour le type int) La fonction se compose du mot Java suivi du nom du package suivi du nom de la classe java ayant les accès natif suivi du nom de la fonction à appeler. Concernant les arguments Le 1er argument (JNIEnv* env) est un pointeur sur un objet permettant d’exécuter des fonction JNI Le 2eme argument (jobjectobj) est une référence sur l’instance de la classe java. En prenant en compte donc la classe java ci dessus, voici donc le contenu de HelloNdk.cpp : Mistra Formation - 19 rue Béranger 75003 Paris - Métro République - 01 82 52 25 25 - [email protected] Utiliser NDK dans un projet Android Les directives ifdef et endif sont obligatoires pour compiler un fichier C++ avec gcc. Lors de l’appel à la fonction «stringFromJNI » depuis la classe native, le système se chargera donc d’appeler la fonction écrite en c++. La difficulté va donc être de pouvoir lire un type java en C pour les valeurs en paramètreet vice versa pour les valeurs de retour. Dans cet exemple, nous employons la fonction NewStringUTF afin de transformer un char* en un type String compatible java. Concernant la fonction addition, celle ci reprend ses paramètres dans la fonction c++, mais doit utiliser le type jint fourni par jni, le calcul se fait normalement. Mistra Formation - 19 rue Béranger 75003 Paris - Métro République - 01 82 52 25 25 - [email protected] Utiliser NDK dans un projet Android Il ne nous reste plus qu’à instancier la classe Natif et appeler sa fonction native (dans une activité par exemple) : . Mistra Formation - 19 rue Béranger 75003 Paris - Métro République - 01 82 52 25 25 - [email protected] Powered by TCPDF (www.tcpdf.org)