build-scripts/androidbuildlibs.sh
author Sam Lantinga <slouken@libsdl.org>
Sun, 13 Aug 2017 17:59:59 -0700
changeset 11262 8e5441ab6c63
child 11836 a42b155124a3
permissions -rw-r--r--
Fixed bug 2839 - No way to create pre-built libraries for Android

Mark Callow

README-android says to copy or link the SDL source tree to the jni folder in your Android project. It is not desirable to have to compile SDL with every application; furthermore the Android NDK has support for prebuilt libraries.

Attached is script (to be put in build-scripts) that builds the Android version of the libraries. The script builds both the existing SDL2 module and a new SDL2_main module. This is a static library containing the code from src/main/android/SDL_android_main.c. Also attached is a patch for Android.mk adding this module.

Note that when building an application's native .so using this prebuilt libSDL2main, you must use a link option, such as --whole-archive, that forces inclusion of the code in the .so because the functions in SDL_android_main are called only from Java.
     1 #!/bin/sh
     2 #
     3 # Build the Android libraries without needing a project
     4 # (AndroidManifest.xml, jni/{Application,Android}.mk, etc.)
     5 #
     6 # Usage: androidbuildlibs.sh [arg for ndk-build ...]"
     7 #
     8 # Useful NDK arguments:
     9 #
    10 #  NDK_DEBUG=1          - build debug version
    11 #  NDK_LIBS_OUT=<dest>  - specify alternate destination for installable
    12 #                         modules.
    13 #
    14 # Note that SDLmain is not an installable module (.so) so libSDLmain.a
    15 # can be found in $obj/local/<abi> along with the unstripped libSDL.so.
    16 #
    17 
    18 
    19 # Android.mk is in srcdir
    20 srcdir=`dirname $0`/..
    21 srcdir=`cd $srcdir && pwd`
    22 cd $srcdir
    23 
    24 
    25 #
    26 # Create the build directories
    27 #
    28 
    29 build=build
    30 buildandroid=$build/android
    31 obj=
    32 lib=
    33 ndk_args=
    34 
    35 # Allow an external caller to specify locations.
    36 for arg in $*
    37 do
    38   if [ "${arg:0:8}" == "NDK_OUT=" ]; then
    39 	obj=${arg#NDK_OUT=}
    40   elif [ "${arg:0:13}" == "NDK_LIBS_OUT=" ]; then
    41 	lib=${arg#NDK_LIBS_OUT=}
    42   else
    43     ndk_args="$ndk_args $arg"
    44   fi
    45 done
    46 
    47 if [ -z $obj ]; then
    48   obj=$buildandroid/obj
    49 fi
    50 if [ -z $lib ]; then
    51   lib=$buildandroid/lib
    52 fi
    53 
    54 for dir in $build $buildandroid $obj $lib; do
    55     if test -d $dir; then
    56         :
    57     else
    58         mkdir $dir || exit 1
    59     fi
    60 done
    61 
    62 
    63 # APP_* variables set in the environment here will not be seen by the
    64 # ndk-build makefile segments that use them, e.g., default-application.mk.
    65 # For consistency, pass all values on the command line.
    66 ndk-build \
    67   NDK_PROJECT_PATH=null \
    68   NDK_OUT=$obj \
    69   NDK_LIBS_OUT=$lib \
    70   APP_BUILD_SCRIPT=Android.mk \
    71   APP_ABI="all" \
    72   APP_PLATFORM=android-12 \
    73   APP_MODULES="SDL2 SDL2_main" \
    74   $ndk_args