IT | Portage d'une librairie C++ vers Android

Bonjour internaute !

Ici, simplement quelques notes non exhaustives concernant le porrtage d'une librairie C++ sous Androïd.

/!\ Article en cours de rédaction /!\

Objectif : Utiliser sa librairie C++ dévelopée sur un PC classique dans une application sur une plateforme mobile Android

Ingrédients :

  • NDK Android
  • Android Studio
  • Une librairie C++ conçue par nos soins

Recette :

1/ Sur Android l'architecture des processeurs est bien souvent de l'ARM. La librairie C++ déjà développée n'est généralement pas compatible avec une architecture ARM. Il faut la recompiler pour les différentes architectures des plateformes mobiles.  Pour ce faire, il faut se munir du kit de développement Android (NDK Android) et de son outil de compilation ndk-build. Cet outil en ligne de commande permet comme tout compilateur de passer des options de compilations afin notamment d'optimiser le programme. Il prend en entrée un fichiers de configurations, dans lequel nous allons spécifier les paramètres de compilation.

Chez moi, ce fichier (exemple à venir) contient les options pour compiler ma librairie vers les architectures ARM et x86 suivantes : armeabi, armeabi-v7a, arm64-v8a (64 bits), x86 et x86_64 (64 bits). Par ailleurs, j'ai optimisé ma librairie en privilégiant le temps de calcul en configurant les options APP_OPTIM en release et en ajoutant les flags C++   -O3 -Ofast. On obtient plusieurs librairies qu'il faut ensuite rassembler en une seule avec la commande lipo -create libun.so libdeux.so -output malibrairie.so

2/ Une fois la librairie C++ compatible pour toutes les architectures, il faut écrire un wrapper (une passerelle) entre la librairie et la future application. Ce wrapper est un programme C++ un peu spécial qui permet une interopérabilité au niveau du typage des données. En effet, il n'existe pas, par exemple, de conversion directe entre le type string de la bibliothèque standard de C++ et le type String de Java. Heureusement, Java propose dans son JDK la bibliothèque d'interfaçage JNI qui permet, entres autres, de faire appel dans la machine virtuelle Java à des bibliothèques logicielles extérieures basées sur d'autres langages, tel que le C++. Pour illustrer ce concept, la JNI fournit par exemple un type jstring et deux fonctions GetStringUTFChars et NewStringUTF qui permettent de faire le lien entre le type String de Java et le type string de C++. (exemple à venir)

3/ Une fois écrit, ce wrapper est finalement compilé grâce à la commande ndk-build et produit une librairie que nous avons appelé libmain.so. Il suffit ensuite d'importer les librairies libmalibrairie.so et libmain.so dans une application avec la fonction Java loadLibrary.

4/ Il faut une application pour essayer ! Développer une application de base avec Android Studio. Pour importer votre librairie, il faut simplement faire appel à la fonction System.loadLibrary("malibrairie"). Une fois cet import réalisé, il faut déclarer dans le code les méthodes natives provenant de malibrairie.

Cela est réalisé en les déclarant ainsi, dans la classe principale héritée d'Activity :

private native String coucou(String h);

L'utilisation sera ensuite très basique :

coucou("toto");
Zircon - This is a contributing Drupal Theme
Design by WeebPal.