Android NDK
-
Upload
franck-simon -
Category
Technology
-
view
936 -
download
1
description
Transcript of Android NDK
antislashn.org Android - NDK A - 1/24
Développer en code natifle NDK
antislashn.org Android - NDK A - 2/24
NDK
● Native Development Kit● ensemble d'outils permettant de coder en C/C++ pour la
plateforme Android● Google met bien en avant que ce type de
développement devrait-être exceptionnel
source : Google
antislashn.org Android - NDK A - 3/24
JNI
● JNI effectue le lien entre le code natif C/C++ et le code Java● Java Native Interface
● Pour écrire du code compatible JNI● créer les classes Java dont certaines méthodes seront
implémentée en C/C++– les méthodes auront la signature
● public native return_type methode_name(params_list) ;
● chaque méthode correspondra à une fonction C– qui sera exposée dans un fichier .h– l'outil du JDK javah se charge de créer le .h
● écrire le code implémentant le fichier .h
antislashn.org Android - NDK A - 4/24
Installation du plugin Eclipse
● Pour Windows● installer Cygwin
– http://www.cygwin.com/– sélectionner l'outil make lors de l'installation
– cette étape n'est pas indispensable, le NDK ayant les outils nécessaire
● Installer le plugin Eclipse CDT● C/C++ Develoment Tooling● Help → Install New Software...
– cliquer sur "Avaible Software Sites"– sélectionner http://download.eclipse.org/tools/cdt/releases/indigo
● puis OK
antislashn.org Android - NDK A - 5/24
Installation du plugin Eclipse
antislashn.org Android - NDK A - 6/24
Installation du plugin Eclipse
antislashn.org Android - NDK A - 7/24
Installation du plugin Eclipse
antislashn.org Android - NDK A - 8/24
Installation du plugin Eclipse
● Téléchargez le NDK● http://developer.android.com/tools/sdk/ndk/index.html● décompresser le NDK
● Le plugin NDK a normalement été installé avec le plugin ADT● si ce n'est pas le cas l'installer
– par Help → Install New Software– ajouter le plugin par Add– site : https://dl-ssl.google.com/android/eclipse/
antislashn.org Android - NDK A - 9/24
Installation du plugin Eclipse
● Vérifier que les répertoires soient bien référencés dans les préférences d'Eclipse
antislashn.org Android - NDK A - 10/24
Projet HelloNdk
● Créer un projet Android● Ajouter un répertoire jni
● il contiendra les sources C/C++ et le fichier make
antislashn.org Android - NDK A - 11/24
Projet HelloNdk
● Écrire les méthodes Java à coder en C
● Invoquer l'outil javah pour créer le fichier .h● lancer la commande depuis le répertoire src du projet
● la commande peut-être lancée par– l'ajout d'un outil externe dans Eclipse
● Run → External Tools
– ou automatisée par l'ajout d'un buider au projet● cf pages suivantes
package org.antislashn.android.ndk.hello;
public class Hello {public native String getHelloName(String name);
}
javah -d ..\jni -jni org.antislashn.android.ndk.hello.Hello
antislashn.org Android - NDK A - 12/24
Projet HelloNdk
● Ajout d'un builder pour lancer javah● dans les propriétés du projet ajouter un builder
antislashn.org Android - NDK A - 13/24
Projet HelloNdk
● Ajout d'un builder pour lancer javah● préciser les ressources à rafraîchir après l'exécution du
builder
antislashn.org Android - NDK A - 14/24
Projet HelloNdk
● Ajout d'un builder pour lancer javah● préciser quand devra être lancé le builder
antislashn.org Android - NDK A - 15/24
Projet HelloNdk
● L'exécution de javah a créé dans le répertoire jni : org_antislashn_android_ndk_hello_Hello.h
/* DO NOT EDIT THIS FILE - it is machine generated */#include <jni.h>/* Header for class org_antislashn_android_ndk_hello_Hello */
#ifndef _Included_org_antislashn_android_ndk_hello_Hello#define _Included_org_antislashn_android_ndk_hello_Hello#ifdef __cplusplusextern "C" {#endif/* * Class: org_antislashn_android_ndk_hello_Hello * Method: getHelloName * Signature: (Ljava/lang/String;)Ljava/lang/String; */JNIEXPORT jstring JNICALL Java_org_antislashn_android_ndk_hello_Hello_getHelloName (JNIEnv *, jobject, jstring);
#ifdef __cplusplus}#endif#endif
antislashn.org Android - NDK A - 16/24
Projet HelloNdk
● JNIEnv est un pointeur vers un structure correspondant à l'interface de la JVM● la syntaxe C++ JNI est simple car le déférencement du
pointeur reçu est effectué par env->● par contre en C il sera effectué par (*env)->
● pour plus de détails sur JNI : http://java.sun.com/docs/books/jni/
source : Oracle
antislashn.org Android - NDK A - 17/24
Projet HelloNdk
● Créer le ficher hello.c dans le répertoire jni
#include "org_antislashn_android_ndk_hello_Hello.h"#include "string.h"
jstring Java_org_antislashn_android_ndk_hello_Hello_getHelloName(JNIEnv * env, jobject thiz, jstring name){
char message[50] = "Bonjour, ";const char *str;str = (*env)->GetStringUTFChars(env,name,NULL);if(str==NULL){
return NULL;}strcat(message,str);return (*env)->NewStringUTF(env,message);
}
antislashn.org Android - NDK A - 18/24
Projet HelloNdk
● La compilation du fichier .C est effectué à l'aide du script ndk-build● qui est dans le répertoire du NDK● script qui invoque la commande make● il faut donc ajouter dans le répertoire jni le fichier .mk,
nommé Android.mk
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := hello-jniLOCAL_SRC_FILES := hello.c
include $(BUILD_SHARED_LIBRARY)
antislashn.org Android - NDK A - 19/24
Projet HelloNdk
● Prise en compte de l'outil ndkbuild par Eclipse● dans les propriétés du projet ajouter un nouveau builder
antislashn.org Android - NDK A - 20/24
Projet HelloNdk
● Paramétrer le répertoire contenant les sources
antislashn.org Android - NDK A - 21/24
Projet HelloNdk
● Paramétrer les éléments à rafraîchir
antislashn.org Android - NDK A - 22/24
Projet HelloNdk
● Le lancement de la compilation est visible dans la console Eclipse
● Le répertoire libs contient bien le fichier .so
antislashn.org Android - NDK A - 23/24
Projet HelloNdk
● Il ne reste plus qu'à modifier l'activité de base pour appeler la méthode getHelloName()
public class HelloNdkActivity extends Activity {
static {System.loadLibrary("hello-jni");
}
@Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_hello_ndk); TextView tv = (TextView) findViewById(R.id.tv); Hello hello = new Hello(); tv.setText(hello.getHelloName("Franck")); }
}
chargement de la librairielibhello-jni.so
antislashn.org Android - NDK A - 24/24
Projet HelloNdk
● Il ne reste plus qu'à déployer l'application sur l'émulateur● on retrouve bien la librairie dans l'explorateur de fichier
DDMS– répertoire data/data