Premiers pas avec android-ndk

Premiers pas avec Android NDK avec un exemple simple

À l’aide d’Android Studio 2.2 et du kit de développement natif (NDK) supérieur, vous pouvez utiliser pour compiler du code C et C++.

Vous pouvez utiliser NDK en téléchargeant manuellement NDK et en le construisant ou via CMake .

Ici, je vais donner le flux de processus pour installer manuellement NDK et un exemple de code,

En fonction de votre système d’exploitation, vous pouvez télécharger NDK à partir de cet emplacement https://developer.android.com/ndk/downloads/index.html.

Après le téléchargement, indiquez le chemin dans la variable d’environnement système sous le nom de variable “NDK_PROJECT_PATH” et la valeur de variable “emplacement du chemin stocké NDK”.

  • Ensuite, pour intégrer NDK à Android Studio, après avoir créé un nouveau projet Android,

    In gradle – local properties add location of sdk path like

      sdk.dir=F\:\\gowtham\\Android\\sdk
    

    and

       android.useDeprecatedNdk = true
    
  • Ensuite, appuyez sur Build - Make Project (Ctrl + f9).

    Your project will be successfully build and will get BUILD SUCCESFUL in message gradle build, as shown below

[![entrez la description de l’image ici][1]][1]

Ensuite, dans Terminal, il contiendra initialement le chemin du projet

Là, ajoutez cd app/src/main

Le chemin s’étendra du chemin du projet au principal.

Ensuite, encore une fois Build - Make Project (Ctrl + f9).

Vous trouverez maintenant sous le dossier app-build–intermediates–classes–debug, comme indiqué ci-dessous.

[![entrez la description de l’image ici][2]][2]

Maintenant, créez un nouveau fichier de classe Java sous un app/src/main/java , Ici, j’ai créé un fichier java nommé NativeClass

[![entrez la description de l’image ici][3]][3]

Écrivez une fonction d’appel simple avec le nom de la fonction et l’entrée pour la fonction, Ici, j’ai écrit la fonction comme exemple et donné deux entrées entières,

[![entrez la description de l’image ici][4]][4]

Compilez à nouveau le projet (Ctrl + f9),

Lorsque vous construisez, vous trouverez le fichier de classe créé sous build comme celui-ci,

[![entrez la description de l’image ici][5]][5]

Then,in terminal 
    `-Javah  -d  jni –classpath ../../build/intermediates/classes/debug`application.com.ndkapplication.NativeClass

où , -d – for output directory -jni -Generate JNI-style header file (default) -classpath – for which to load classes

Construisez maintenant le projet (Ctrl + f9), vous trouverez le dossier jni créé et un fichier d’en-tête sera créé avec le nom que vous avez spécifié dans le terminal avant, comme indiqué ci-dessous

[![entrez la description de l’image ici][6]][6]

Copiez maintenant le fichier d’en-tête et enregistrez-le en tant que fichier .cpp ou .c du même nom que le fichier d’en-tête dans jni dossier .

J’ai créé un fichier cpp comme indiqué ci-dessous

[![entrez la description de l’image ici][7]][7]

Delete everything before **JNIEXPORT line** in this file and **add header file name** alone.
Here I am for simple example just adding two numbers and returning value to android java.

Application_com_ndkapplication_NativeClass.cpp

 #include <application_com_ndkapplication_NativeClass.h>

JNIEXPORT jint JNICALL Java_application_com_ndkapplication_NativeClass_example
  (JNIEnv *, jclass , jint as , jint bs){

    return (as + bs);

    }

Et pour cet exemple, pas besoin d’ajouter de fonction dans son fichier d’en-tête.

Créez un nouveau fichier nommé Android.mk et Application.mk dans le dossier Jni

Le fichier Android.mk sert à décrire vos sources au système de construction.

Android.mk

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)

LOCAL_SRC_FILES := application_com_ndkapplication_NativeClass.cpp

LOCAL_LDLIBS += -llog

LOCAL_MODULE := exp-jni

include $(BUILD_SHARED_LIBRARY)

pour connaître les détails de ce fichier, lisez ce lien https://developer.android.com/ndk/guides/android_mk.html

[![entrez la description de l’image ici][8]][8]

Application.mk qui décrit les modules natifs requis par votre application.

Application.mk

APP_STL := gnustl_static

APP_CPPFLAGS := -frtti –fexceptions

APP_ABI := armeabi-v7a armeabi arm64-v8a mips mips64 x86 x86_64

APP_PLATFORM := android-16

pour connaître les détails de ce fichier, lisez ce lien https://developer.android.com/ndk/guides/application_mk.html

[![entrez la description de l’image ici][9]][9]

 Now build the project again **(Ctrl + f9)**, you will find the **armeabi-v7a, armeabi, arm64-v8a ,mips, mips64, x86 and x86_64** folder created inside jniLibs.

Ensuite, dans l’activité principale, passez l’entrée et obtenez la sortie pour le fichier de classe natif.

int a = 5, b = 5, res ;

res = NativeClass.example(((int) a),((int) b));

TextView textView = (TextView) this.findViewById(R.id.tv);

textView.setText(new Integer(res).toString());

ici, j’ai donné deux entiers entrés via a, b et obtenu la sortie de la variable res .

Et la sortie obtenue est affichée à l’écran en passant à TextView.

Et n’oubliez pas d’ajouter la ** bibliothèque ** que vous avez spécifiée dans le fichier Android.mk comme LOCAL_MODULE comme ceci,

static {
        System.loadLibrary("exp-jni");
  }

Enfin, reconstruisez le projet (Ctrl + f9), vous trouverez les fichiers .so créés sous chaque dossier armeabi-v7a, armeabi, arm64-v8a, mips, mips64, x86 et x86_64.

[![entrez la description de l’image ici][10]][10]

Ensuite, exécutez maintenant l’application, vous obtiendrez une sortie pour cet exemple sous la forme 10 .

[![entrez la description de l’image ici][11]][11]

Il s’agit d’un programme de base pour les débutants NDK, la bibliothèque OpenCV peut être importée ici et vous pouvez également créer des applications de traitement d’image.

[1] : https://i.stack.imgur.com/FpF65.png [2] : https://i.stack.imgur.com/1LbB9.png [3] : https://i.stack.imgur.com/Kkte6.png [4] : https://i.stack.imgur.com/jqsKO.png [5] : https://i.stack.imgur.com/sWKrP.png [6] : https://i.stack.imgur.com/VKyFy.png [7] : https://i.stack.imgur.com/WMsoL.png [8] : https://i.stack.imgur.com/tJe8o.png [9] : https://i.stack.imgur.com/nyuKz.png [10] : https://i.stack.imgur.com/zu1Ec.png [11] : https://i.stack.imgur.com/BNmEN.png