This document contains various information regarding usage
of libosmscout for/under Android using the Qt backend
as part of Qt applications under Android.

Installation of the Android development environment under Arch Linux
====================================================================

Instructions are for compiling under x86_64 Arch Linux.

* Activate multilib, see https://wiki.archlinux.org/index.php/multilib
  and https://wiki.archlinux.org/index.php/Arch64_FAQ
  
* Install the Android AUR packages:
  https://wiki.archlinux.org/index.php/android
  
* I did not install any platforms at this point, since the
  android-qt5 package will install relevant AUR packages (platform
  versions 10, 11, 16) anyway.
  
* Install the normal Qt development environment and also the package
  android-qt5. Make sure that the Qt versions match. This will also
  pull in the android-ndk package.
  
* set environment variable ANDROID_NDK_ROOT, the variable should point
  to the root of the NDK.
  (in case of arch linux: /opt/android-ndk)
  
* Because we want to use the C++ compiler together with the stl, we
  need to create a standalone toolchain. For this call using root
  rights:

  make-standalone-toolchain.sh \
    --verbose \
    --toolchain=arm-linux-androideabi-4.8 \
    --system=linux-X86_64 \
    --install-dir=/home/tim/projects/arm-linux-androideabi-4.8

  The install directory of course could be places somewhere else

* set environment variable ANDROID_SYSROOT, the variable should point
  to the to be used platform tools sysroot directory.
  (/home/tim/projects/arm-linux-androideabi-4.8/sysroot im my case).

Cross compilation of libosmscout, libosmscout-map and libosmscout-map-qt
========================================================================

The Android SDK/NDK supports various toolschains for various platforms,
in the following examples we target arm-linux-androideabi, which is used by
most modern Android mobiles. We also target API level 16, which corresponds
to Android 4.1.2 - things however should work similar for other platforms
and API versions.

* extend the path to contain bin directory of your toolchain
  (/home/tim/projects/arm-linux-androideabi-4.8/bin)
  
* set a number of environment variables to point to the
  corresponding files in the toolchain directory:

  export CPP=arm-linux-androideabi-cpp
  export CC=arm-linux-androideabi-gcc
  export CXX=arm-linux-androideabi-g++
  export LD=arm-linux-androideabi-ld

  export CPPFLAGS="--sysroot=$ANDROID_SYSROOT -march=armv7-a -mfloat-abi=softfp -mfpu=vfp"
  export CFLAGS="--sysroot=$ANDROID_SYSROOT -march=armv7-a -mfloat-abi=softfp -mfpu=vfp"
  export CXXFLAGS="--sysroot=$ANDROID_SYSROOT -march=armv7-a -mfloat-abi=softfp -mfpu=vfp"

  export PKG_CONFIG_LIBDIR=$ANDROID_SYSROOT/lib

  Note that I'm not sure regarding the correct directory for
  PKG_CONFIG_LIBDIR. However in this example it was just important
  that it did not find the libraries on the host.

  Note that PKG_CONFIG_SYSROOT_DIR should possibly also have been
  set, but in this case this would force us to install libosmscout
  for its headers to be found because all paths in the *.pc would be
  prefixed with the variable content.

  Note that PKG_CONFIG_PATH should point to the various used libosmscout-*
  directories and to the directory of the Android-Qt package containing
  the *.pc files
  (under arch linux: /opt/android-qt5/5.3.0/lib/pkgconfig/)

* For Android version-less libraries have to get build (requirement of the
  device local shared library loader). Standard under Linux are versioned
  libraries. It is the task of the used libtool package to do platform
  dependend compiler/linker calls, however libtool currently does not have
  special handling for Android. Android is thus detected as Linux and
  this versioned libraries are build. You have to patch your local
  m4/libtool.m4 to get the special handling for Android. Apply the
  following patch:
  
  http://lists.gnu.org/archive/html/libtool-patches/2013-06/msg00002.html
  
  Note that autoconf may reinstall the official libtool.m4 if autogen.sh
  is called. You then have to reapply the patch.

* Now configure and compile the libraries using:
  ./configure --host=arm-linux-androideabi --with-sysroot=$ANDROID_SYSROOT --disable-openmp-support

  Note  that openmp seams to be not supported (I got crashes quickly) so
  disable it using the above configure option for configure scripts that
  test for it (libosmscout).

  Note that the pkg-config tool used is that from the build system, so
  availability of libs detected via pkg-config is not based on the host
  (target) system but on the build system.
  
* Under Android qmake ignores pkg-config calls (it assumes that evaluating
  pkg-config does not make sense while cross compiling). You have to ensure
  that pkg-config is used (and the libosmscout libraries found) by adding

  QT_CONFIG -= no-pkg-config

  to the OSMScout2 project file.
  
* Goto the OSMScout2 directory and call the qmake from the Android-Qt5 package
  to generate a makefile.
  (under arch linux: /opt/android-qt5/5.3.0/bin/qmake).

* Build OSMScout2 by calling make.

* Building the Android *.apk fro the sources

  We assume that the package will get build in the "android-pkg" sub directory
  (of the OSMScout2 directory).
  Any templates will be searched in the sub directory "android".

  We clean up the existing directory:
  
  rm -rf android-pkg
  
  Then we install the OSMScout application into the android-pkg directory:
  
  make install INSTALL_ROOT=android-pkg

  We then call the Qt androiddeployqt application:
  
  /opt/android-qt5/5.3.0/bin/androiddeployqt --input android-libOSMScout.so-deployment-settings.json --output android-pkg --android-platform android-16 --verbose --install
  
  In this case we use the *.json file generated by the build as information
  base, place the package into the "nadroid-pkg" directory, build for
  platform 16, output a number of details and finally install the package
  directly onto the device (you must have USB debugging on the mobile active
  and the mobile connected and detected vi USB).
  
  Since the path to the libosmscout libraries is already (hardcoded) in the
  project file, these dependend libraries will get automatically placed into
  the package.
  
  That's it.

