Introduction au NDK sous Android

Qu’est ce que le NDK

Le NDK (Native Developpement Kit – Kit de développement natif) est un outil permettant d’implémenter des parties natives (en C ou C++) pour vos application. Cela vous permet par exemple, de créer du code commun (bibliothèque) entre plusieurs applications ou entre des applications Android & IOS par exemple.

Pré-requis

  • Pour commencer, téléchargez le NDK correspondant à votre OS (le tutoriel ce déroule sous MacOSX) sur le site suivant : http://developer.android.com/tools/sdk/ndk/index.html
  • Décompressez le contenu de votre NDK à l’emplacement de
  • Si vous êtes sous Windows, il faut absolument installer une solution tel que Cygwin, pour faciliter l’utilisation du NDK et la compilation
  • L’utilisation du SDK nécessite aussi l’installation de “make” afin de compiler les sources natives

Création d’un projet

Pour commencer, créez un projet Android (“HelloNDK” dans l’exemple) en suivant les étapes çi-dessous :

Maintenant, créez un dossier “jni” (Java Native Interface) à la racine de votre projet. Ce dossier contiendra tout d’abord deux fichiers :

  • Un fichier Android.mk : Ce fichier servira à décrire la structure de votre projet utilisé par le NDK pour la compilation de vos fichiers natifs
  • Un fichier de code natif (ici hello.c) : Contiendra votre code natif

Android Makefile

L’un des fichiers important de votre projet est votre Android Makefile ‘Android.mk‘. Comme expliqué précipitamment, ce fichier sert défini les éléments nécessaires à la compilation de vos fichiers natifs. Il peux contenir les éléments suivants :

  • Le nom de votre module : Option LOCAL_MODULE
  • Les fichiers sources de votre application : Option LOCAL_SRC_FILSE
  • Les bibliothéques utilisées par votre code natif : Option LOCAL_SHARED_LIBRARIES
  • Des variables utiles pour votre compilation, ces variables doivent être vider à chaque compilation, donc utilisez include $(CLEAR-VARS)
  • Des tags : Options LOCAL_MODULE_TAGS
  • Le type de build souhaité : BUILD_PACKAGE, BUILD_EXECUTABLE, BUILD_SHARED_LIBRARY

Voici l’exemple correspondant à notre projet

LOCAL_PATH := $(call my-dir)
#Vider les variables utilisées
include $(CLEAR_VARS)
#Nom du module (donc de la bibliothéque générée)
LOCAL_MODULE := hellondk
#Fichiers sources utilisées
LOCAL_SRC_FILES := hello.c
#Type de fichier en sortie (ici bibliothéque partagée)
include $(BUILD_SHARED_LIBRARY)

hello.c

Ce fichier contient votre code natif, dans notre cas, ce code servira uniquement à afficher le message “Hello NDK :)”

#include <string.h>
#include <jni.h>

jstring Java_com_tuto_hellondk_MainActivity_invokeNativeFunction(JNIEnv* env, jobject thiz)
{
	return (*env)->NewStringUTF(env, "Hello NDK :)");
}

Le nom de votre méthode doit être se composer des parties suivantes :

  • Commence par Java
  • puis votre nom de package ou vous remplacez les points par des _
  • puis le nom de l’activité cible (ici MainActivity)
  • puis le nom de votre fonction (ici invokeNativeFunction)

Compilation

Maintenant, nous allons compiler notre projet NDK pour créer une bibliothèque (.so = bibliothèque dynamique) afin de l’intégrer dans notre classe Java.

Pour compiler, il suffit de vous déplacer dans le dossier de votre projet et exécutez la commande “ndk-build”

La bibliothéque .so est généré dans le dossier libs/armeabi de votre projet

Intégration JAVA

Maintenant, nous allons intégrer la bibliothèque généré dans l’activité de notre projet (MainActivity) à l’aide de la méthode loadLibreary. Il faut spécifier le nom de la bibliothèque à charger.

static {
	System.loadLibrary("hellondk");
}

Puis la déclaration de la méthode invoteNativeFunction() disponible dans la bibliothèque chargé précédemment

private native String invokeNativeFunction();

Puis utilisez la méthode pour récupérer la chaîne de caractère renvoyer par la méthode native

String hello = invokeNativeFunction();

Ce qui donnera pour votre activité

package com.tuto.hellondk;

import android.os.Bundle;
import android.app.Activity;
import android.widget.TextView;

public class MainActivity extends Activity {
	
	static {
		System.loadLibrary("hellondk");
	}
	
	private native String invokeNativeFunction();
	
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        
        TextView helloTextView = (TextView) findViewById(R.id.hello);
        String hello = invokeNativeFunction();
        helloTextView.setText(hello);
    }
    
}

Résultat

Maintenant, exécutez votre application sur un appareil ou un émulateur. Ce qui donnera :

Vous pouvez télécharger, le projet d’exemple, à l’adresse suivante

Si vous voulez, aller plus loin, dans l’utilisation du NDK (en attendant d’autres tuto :)), voici le lien vers une conférence du PAUG sur le NDK (slide & vidéo) : http://www.paug.fr/conference-paug/compte-rendu-conference-paug/slides-et-video-conference-android-ndk-1er-mars-2013-par-sylvain-ratabouil/

à bientôt 😉

3 commentaires




  1. Ton projet en partage ne fonctionne pas, impossible de l’ouvrire sous eclipse. j’ai suivie a la lettre. l’application plante.

    Répondre

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *