[[PageOutline]] = How To Build BOINC Apps for Android = This document describes how to build BOINC apps for Android. We assume the app is written in C/C++. It must be cross-compiled on a non-Android system (Linux, Windows, or Mac; the instructions here are for Linux). The BOINC API library (libboincapi) must also be cross-compiled and linked. The result of this is a "native mode" executable for a particular architecture (ARM, MIPS, or Intel) on Android. Various build systems can be used for this purpose: * The GNU tools (configure/make). * Eclipse * Android Studio In this document we'll use the GNU tools. == Cookbook == In the following, we'll assume that on your build system: * the BOINC source tree is at '''~/boinc'''. * the source code for your application is at '''~/my_app'''. Download and install the latest Android Native Development Kit (NDK): http://developer.android.com/tools/sdk/ndk/index.html Set an environment variable NDKROOT to point to the NDK directory, e.g. {{{ export NDKROOT="$HOME/android-ndk-r10d" }}} Prepare the Android toolchain by doing {{{ ~/boinc/android/build_androidtc_arm.sh }}} Now build your app as follows: {{{ cd ~/my_app ~/boinc/android/boinc_build_app_arm.sh }}} Note: this assumes we're building an ARM executable. If you want to build MIPS or Intel, substitute "mips" or "intel" in the above commands. HOW TO BUILD BOINC LIBS? HOW TO LINK WITH BOINC LIBS? == Building FPU versions == To build a version for VFP: {{{ -O3 -mhard-float -mfpu=vfp -mfloat-abi=softfp -fomit-frame-pointer }}} To build a version for neon: {{{ -O3 -mhard-float -mfpu=neon -mfloat-abi=softfp -fomit-frame-pointer }}} It's often useful to build a single executable that can support the vfp or neon libraries & instructions, and then use the BOINC APP_INIT_DATA and HOST_INFO structures to find the capabilities of the host and call the appropriate optimized routines (member variable 'p_features' e.g. strstr(aid.host_info.p_features, " neon "). You can do this by selectively compiling using the above options, into separate small libraries that you link into the single executable, and use C++ namespaces to separate similar function calls. Refer to the boinc/client/Makefile.am and client/whetstone.cpp, and client/cs_benchmark.cpp files for an example of how to do this. == Deploying Android app versions == BOINC on Android uses the following BOINC platform identifier: "arm-android-linux-gnu" "x86-android-linux-gnu" "mipsel-android-linux-gnu" (how to use plan classes if you have separate FPU versions) The client reports CPU architecture and capabilities, i.e. VFP and NEON support, to the project server. == Position-independent executables (PIE) == Starting with version 4.1, Android supports '''position-independent executables''' (PIE). Starting with version 5.0, PIE is mandatory - Android refuses to run native executables that are not PIE. You can build PIE apps by including in your Makefile: {{{ LOCAL_CFLAGS += -fPIE LOCAL_LDFLAGS += -fPIE -pie }}} You should use plan classes so that * PIE versions are sent only to Android 4.1 or later devices. * non-PIE versions are sent only to pre-5.0 devices. For example (using [AppPlanSpec XML plan class specification]): {{{ android_arm_pie 40100 android_arm_non_pie 49999 }}} If you have both PIE and non-PIE, change the 49999 to 40099. == FORTRAN on Android NDK (optional build) == The Android NDK currently does not have a FORTRAN compiler distributed with it. But it is possible to build GNU Fortran (gfortran) libraries for ARM/Android using the information at [http://danilogiulianelli.blogspot.co.uk/2013/02/how-to-build-gcc-fortran-cross-compiler.html] == Example == Setup the environment: [http://boinc.berkeley.edu/trac/browser/boinc-v2/samples/example_app/build_android.sh] Android Makefile: [http://boinc.berkeley.edu/trac/browser/boinc-v2/samples/example_app/Makefile_android] An example of how to adapt a BOINC app's Makefile to compile it for Android can be found in the BOINC sources at: [https://github.com/novarow/AndroidBOINC/blob/master/native/diffs_android/uppercase/Makefile_android] Note that the AndroidBOINC build script sets up the required environment variables for the standard C++ library as well as the Android SYSROOT. -llog refers to the library required to use Logcat from native code. Logcat is used for debugging purposes and is not required for the app's functionality.