Tarnyko's website
Tarnyko's website
about

[Tutoriel] Cross-compiler Libgee pour Android

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 😉.

android_logo

Pré-requis

Une distribution Linux 32-bits en état de marche 😉.

1) Installer la chaîne de compilation

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)

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

    et l'extraire dans "/opt" :
sudo tar xfvj android-ndk-r4c-0moz3.tar.bz2 -C /opt
  1. Télécharger le script agcc spécifique à ce NDK (merci à Rozenix pour son travail) :
    agcc.pl-r4c0moz3 (8 Ko)

    et l'installer dans "/opt" en le rendant exécutable :
sudo install -m 755 agcc.pl-r4c0moz3 /opt/
sudo ln -s /opt/agcc.pl-r4c0moz3 /usr/bin/agcc

2) Installer la bibliothè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 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/

3) Définir les variables d'environnement

  1. Nous ajoutons l'Android NDK au PATH (afin qu'agcc puisse le localiser) :
export PATH=$PATH:/opt/android-ndk-r4c/build/prebuilt/linux-x86/arm-eabi-4.4.0/bin
  1. Nous indiquons à pkg-config où rechercher les nouvelles bibliothèques :
export PKG_CONFIG_PATH=/opt/android/lib/pkgconfig
  1. Finalement, nous définissons plusieurs 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 :

./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à !


Note importante

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... 😉.