Vous êtes ici

Tutoriel : cross-compiler Libgee sous Linux pour Android

Objectif : compiler une bibliothèque C/C++ généraliste sous Linux, destinée à Android.

On m'a demandé plusieurs fois comment cross-compiler une bibliothèque connue (Libgee, SQLite, etc...) sous Linux pour Android.
Nous allons ici prendre l'exemple de Libgee, car elle a peu de dépendances et son code source est compatible. Cependant, souvenez-vous que les choses ne sont pas toujours si simples ;-)


Pré-requis

Une distribution Linux Debian ou Ubuntu.

1) Installer la chaîne de compilation

Libgee requiert une chaîne de compilation basique, plus GLib. Nous pourrions utiliser l'Android NDK r7b, relativement récent, mais nous allons plutôt installer l'ancien NDK r4c de Mozilla. Pourquoi ? Parce que GLib est difficile à compiler, alors nous n'allons pas le faire nous-mêmes, mais utiliser ma version pré-compilée, qui a été générée avec le NDK r4c ;-) (d'ou le besoin d'utiliser la même chaîne pour garder l'ABI compatible au maximum).

- Télécharger l'Android NDK r4c (Mozilla) pour Linux :
android-ndk-r4c-0moz3.tar.bz2 (119 Mo)

(et l'extraire dans "/opt" :
mv android-ndk-r4c-0moz3.tar.bz2 /opt
cd /opt
tar xfvj android-ndk-r4c-0moz3.tar.bz2)

- Télécharger ce script agcc spécifique (merci à Rozenix pour son travail) :
agcc.pl-r4c0moz3 (8 Ko)

(et l'installer dans "/opt" en le rendant exécutable :
mv agcc.pl-r4c0moz3 /opt
chmod a+x /opt/agcc.pl-r4c0moz3
ln -s /opt/agcc.pl-r4c0moz3 /usr/bin/agcc
)


2) Installer la blbliothèque GLib pour Android

GLib est la seule dépendance "dure" de Libgee ; nous utiliserons ma version précompilée ici par souci de simplicité. En fonction de ce que vous essaierez de compiler de votre côté, vous aurez peut-être besoin de davantage de bibliothèques (à télécharger ou générer vous-même).

- Télécharger GLib 2.28.1 pour Android :
glib-2.28.1-android_(TARNYKO).tar.bz2 (1,81 Mo)

(à extraire dans un nouveau dossier "/opt/android" :
mkdir /opt/android
mv glib-2.28.1-android_\(TARNYKO\).tar.bz2 /opt/android
tar xfvj glib-2.28.1-android_\(TARNYKO\).tar.bz2
)


3) Définir les variables d'environnement

- Nous ajoutons l'Android NDK au PATH (afin qu'agcc le localise) :
export PATH=$PATH:/opt/android-ndk-r4c/build/prebuilt/linux-x86/arm-eabi-4.4.0/bin

- Nous indiquons à "pkg-config" de rechercher les bibliothèques dans notre arborescence particulière (afin qu'il localise GLib) :
export PKG_CONFIG_PATH=/opt/android/lib/pkgconfig

- Finalement, nous définissons quelques variables utilisées par le script "./configure" pour générer le Makefile :
export CFLAGS="-I/opt/android/include"
export CPPFLAGS="-I/opt/android/include"
export LDFLAGS="-L/opt/android/lib"
export XDG_DATA_DIRS="/opt/android/share"

export CC=agcc
export CXX=agcc
export LD=arm-eabi-ld
export RANLIB=arm-eabi-ranlib
export AR=arm-eabi-ar
export AS=arm-eabi-as
export STRIP=arm-eabi-strip


4) Compiler

Extraire l'archive source de LibGee, se déplacer dans son répertoire, puis lancer le (quasi-)habituel :

./configure --prefix=/opt/android --host=arm-eabi-linux --enable-shared --enable-static
make
make install


Les binaires résultants pourront être trouvés dans "/opt/android".

Voilà !

NOTE IMPORTANTE

Ici, tout s'est bien passé car, par chance, Libgee n'utilise que des appels systèmes compatibles à la fois avec GNU/Linux et Android. Cependant, souvenez-vous qu'Android embarque sa propre bibliothèque C -appelée Bionic- qui n'implémente pas toutes les fonctions de la GLibc Linux. Autrement dit, cela ne marchera pas avec toutes les bibliothèques, et dans ce cas vous devrez mettre à profit toutes vos compétences de développeur C pour patcher leur code source... ;-)