2013-07-15
Objectif : compiler une bibliothèque généraliste pour Android.
On m'a demandé plusieurs fois comment cross-compiler une bibliothèque connue (Libgee, SQLite, etc...) 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 😉.

Une distribution Linux 32-bits en état de marche 😉.
Libgee requiert une chaîne de compilation basique, et n'a pour dépendance que la GLib.
Nous pourrions utiliser l'Android NDK r7b, relativement récent ; mais nous allons plutôt installer l'ancien NDK r4c de Mozlla.
Pourquoi ? Parce que GLib, elle, 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)
sudo tar xfvj android-ndk-r4c-0moz3.tar.bz2 -C /opt
sudo install -m 755 agcc.pl-r4c0moz3 /opt/
sudo ln -s /opt/agcc.pl-r4c0moz3 /usr/bin/agcc
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 plus tard 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.l pour Android :
glib-2.28.1-android_(TARNYKO).tar.bz2 (1,81 Mo)
et l'extraire dans un nouveau répertoire "/opt/android" :
sudo mkdir /opt/android
sudo tar xfvj glib-2.28.1-android_\(TARNYKO\).tar.bz2 -C /opt/android/
agcc puisse le localiser) :export PATH=$PATH:/opt/android-ndk-r4c/build/prebuilt/linux-x86/arm-eabi-4.4.0/bin
pkg-config où rechercher les nouvelles bibliothèques :export PKG_CONFIG_PATH=/opt/android/lib/pkgconfig
./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
Extraire l'archive source de LibGee, se déplacer dans son répertoire, puis lancer :
./configure --prefix=/opt/android --host=arm-eabi-linux --enable-shared --enable-static
make
sudo make install
Les binaires résultants seront dans "/opt/android".
Voilà !
Tout s'est bien passé ici 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 nommée "Bionic" qui n'implémente pas toutes les fonctions de la GLibc de 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... 😉.