wiki:AndroidBuildApp

Version 12 (modified by carlgt1, 10 years ago) (diff)

added fortran (GNU fortran ie gfortran) android build information per tip from Tolu Aina

How To Build BOINC Apps for Android

This document describes how to build BOINC apps for Android devices.

Requirements

Used versions

Development target:

  • ARM architecture featuring ABI v5
  • NDK-level 4 (Android 1.6)

Tested with:

  • ARM ABI v7 device (Samsung Galaxy SII)
  • Android platform 2.3.4

Compatibility with BOINC on Android

Caution: BOINC on Android runs on all ARM based Android devices. The minimum requirement is therefore ARM ABIv5. Higher ABIs or specific CPU capabilities might only be available on a subset of volunteer's devices. It is the project's responsibility to ensure, that distributed BOINC apps meet these requirements. The client reports CPU capabilities, i.e. VFP and NEON support, to the project server. It is recommended to have a fallback version for ARM ABIv5, since not all devices might have higher ABIs available.

BOINC platform name

BOINC on Android uses BOINC platform identifier: "arm-android-linux-gnu"

Setup NDK toolchain

To set up a custom cross compilation toolchain, see article at AndroidBuildClient

Build script

Take a look at the build scripts in the BOINC software repository. They give you an idea of what steps are required and which cross compilation tools to use.

There are also scripts available, which build required software components, i.e. curl and openSSL, or 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.

Fortran on Android NDK

If your app requires Fortran, note that the Android NDK currently does not have a fortran compiler distributed with it. But it is possible to build GNU Fortran (gfortran) 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.