Utiliser NDK dans un projet Android - Mistra

publicité
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)
Téléchargement