Android NDK

24
antislashn.org Android - NDK A - 1/24 Développer en code natif le NDK

description

Annexe A de mon support de cours Android

Transcript of Android NDK

Page 1: Android   NDK

antislashn.org Android - NDK A - 1/24

Développer en code natifle NDK

Page 2: Android   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

Page 3: Android   NDK

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

Page 4: Android   NDK

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

Page 5: Android   NDK

antislashn.org Android - NDK A - 5/24

Installation du plugin Eclipse

Page 6: Android   NDK

antislashn.org Android - NDK A - 6/24

Installation du plugin Eclipse

Page 7: Android   NDK

antislashn.org Android - NDK A - 7/24

Installation du plugin Eclipse

Page 8: Android   NDK

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/

Page 9: Android   NDK

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

Page 10: Android   NDK

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

Page 11: Android   NDK

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

Page 12: Android   NDK

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

Page 13: Android   NDK

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

Page 14: Android   NDK

antislashn.org Android - NDK A - 14/24

Projet HelloNdk

● Ajout d'un builder pour lancer javah● préciser quand devra être lancé le builder

Page 15: Android   NDK

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

Page 16: Android   NDK

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

Page 17: Android   NDK

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);

}

Page 18: Android   NDK

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)

Page 19: Android   NDK

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

Page 20: Android   NDK

antislashn.org Android - NDK A - 20/24

Projet HelloNdk

● Paramétrer le répertoire contenant les sources

Page 21: Android   NDK

antislashn.org Android - NDK A - 21/24

Projet HelloNdk

● Paramétrer les éléments à rafraîchir

Page 22: Android   NDK

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

Page 23: Android   NDK

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

Page 24: Android   NDK

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