Wiki Page Content

Differences between revisions 28 and 30 (spanning 2 versions)
Revision 28 as of 2015-07-31 19:33:58
Size: 11087
Comment: Updated line from script.
Revision 30 as of 2015-08-14 12:39:58
Size: 11204
Comment: Full build instructions recheck + place ndk-standalone install path in a variable
Deletions are marked like this. Additions are marked like this.
Line 19: Line 19:
 * Install NDK (tested with r8c)  * Install NDK (tested with [[http://dl.google.com/android/ndk/android-ndk-r8c-linux-x86.tar.bz2|r8c]])
Line 26: Line 26:
 * Edit {{{build-scripts/androidbuild.sh}}}, find the {{{$ANDROID update project}}} line, and add {{{--target 'android-XX'}}} to it (replace XX with your installed API number above).  * Edit {{{build-scripts/androidbuild.sh}}}, find the {{{android update project}}} line, and add {{{--target android-XX}}} to it (replace XX with your installed API number above).
Line 78: Line 78:
hg revert --all # remove traces of previous builds
# edit androidbuild.sh and modify android update project --target android-XX
Line 79: Line 81:
# doesn't matter if the actual build fails, it's just for setup
Line 115: Line 118:
/usr/src/android-ndk-r9d/build/tools/make-standalone-toolchain.sh \
  --platform=android-12 --install-dir=/usr/src/ndk-standalone-12-arm --arch=arm
/usr/src/android-ndk-r8c/build/tools/make-standalone-toolchain.sh \
  --platform=android-14 --install-dir=/usr/src/ndk-standalone-14-arm --arch=arm
Line 119: Line 122:
PATH=/usr/src/ndk-standalone-12-arm/bin:$PATH NDK_STANDALONE=/usr/src/ndk-standalone-14-arm
PATH=$NDK_STANDALONE
/bin:$PATH
Line 123: Line 127:
for i in libs/armeabi/*; do ln -nfs $(pwd)/$i /usr/src/ndk-standalone-12-arm/sysroot/usr/lib/; done
mkdir /usr/src/ndk-standalone-12-arm/sysroot/usr/include/SDL2/
\cp jni/SDL/include/* /usr/src/ndk-standalone-12-arm/sysroot/usr/include/SDL2/
\cp jni/*/SDL*.h /usr/src/ndk-standalone-12-arm/sysroot/usr/include/SDL2/
for i in libs/armeabi/*; do ln -nfs $(pwd)/$i $NDK_STANDALONE/sysroot/usr/lib/; done
mkdir $NDK_STANDALONE/sysroot/usr/include/SDL2/
\cp jni/SDL/include/* $NDK_STANDALONE/sysroot/usr/include/SDL2/
\cp jni/*/SDL*.h $NDK_STANDALONE/sysroot/usr/include/SDL2/
Line 129: Line 133:
VERSION=0.9.6 VERSION=0.9.12
cd /usr/src/
Line 134: Line 139:
../configure --prefix=/usr/src/ndk-standalone-12-arm/sysroot/usr ../configure --prefix=$NDK_STANDALONE/sysroot/usr
Line 137: Line 142:
ln -s ../sysroot/usr/bin/pkgconf /usr/src/ndk-standalone-12-arm/bin/arm-linux-androideabi-pkg-config
mkdir /usr/src/ndk-standalone-12-arm/sysroot/usr/lib/pkgconfig/
ln -s ../sysroot/usr/bin/pkgconf $NDK_STANDALONE/bin/arm-linux-androideabi-pkg-config
mkdir $NDK_STANDALONE/sysroot/usr/lib/pkgconfig/
Line 141: Line 146:
cat <<'EOF' > /usr/src/ndk-standalone-12-arm/sysroot/usr/lib/pkgconfig/sdl2.pc
prefix=/usr/src/ndk-standalone-12-arm/sysroot/usr
cat <<'EOF' > $NDK_STANDALONE/sysroot/usr/lib/pkgconfig/sdl2.pc
prefix=/usr/src/ndk-standalone-14-arm/sysroot/usr
Line 148: Line 153:
Version: 2.0.3 Version: 2.0.2.scm
Line 155: Line 160:
cat <<'EOF' > /usr/src/ndk-standalone-12-arm/sysroot/usr/lib/pkgconfig/SDL2_image.pc
prefix=/usr/src/ndk-standalone-12-arm/sysroot/usr
cat <<'EOF' > $NDK_STANDALONE/sysroot/usr/lib/pkgconfig/SDL2_image.pc
prefix=/usr/src/ndk-standalone-14-arm/sysroot/usr
Line 162: Line 167:
Version: 2.0.1 Version: 2.0.0.scm
Line 168: Line 173:
cat <<'EOF' > /usr/src/ndk-standalone-12-arm/sysroot/usr/lib/pkgconfig/SDL2_mixer.pc
prefix=/usr/src/ndk-standalone-12-arm/sysroot/usr
cat <<'EOF' > $NDK_STANDALONE/sysroot/usr/lib/pkgconfig/SDL2_mixer.pc
prefix=/usr/src/ndk-standalone-14-arm/sysroot/usr
Line 175: Line 180:
Version: 2.0.1 Version: 2.0.0.scm
Line 181: Line 186:
cat <<'EOF' > /usr/src/ndk-standalone-12-arm/sysroot/usr/lib/pkgconfig/SDL2_net.pc
prefix=/usr/src/ndk-standalone-12-arm/sysroot/usr
cat <<'EOF' > $NDK_STANDALONE/sysroot/usr/lib/pkgconfig/SDL2_net.pc
prefix=/usr/src/ndk-standalone-14-arm/sysroot/usr
Line 188: Line 193:
Version: 2.0.1 Version: 2.0.0.scm
Line 194: Line 199:
cat <<'EOF' > /usr/src/ndk-standalone-12-arm/sysroot/usr/lib/pkgconfig/SDL2_ttf.pc
prefix=/usr/src/ndk-standalone-12-arm/sysroot/usr
cat <<'EOF' > $NDK_STANDALONE/sysroot/usr/lib/pkgconfig/SDL2_ttf.pc
prefix=/usr/src/ndk-standalone-14-arm/sysroot/usr
Line 201: Line 206:
Version: 2.0.13 Version: 2.0.12.scm
Line 212: Line 217:
../configure --host=arm-linux-androideabi --prefix=/usr/src/ndk-standalone-12-arm/sysroot/usr \ ../configure --host=arm-linux-androideabi --prefix=$NDK_STANDALONE/sysroot/usr \
Line 228: Line 233:
../configure --host=arm-linux-androideabi --prefix=/usr/src/ndk-standalone-12-arm/sysroot/usr \ ../configure --host=arm-linux-androideabi --prefix=$NDK_STANDALONE/sysroot/usr \
Line 247: Line 252:
 * Add `/usr/src/SDL2/src/main/android/SDL_android_main.c` in your project (comment out the line referencing "SDL_internal.h")  * Add `/usr/src/SDL2/src/main/android/SDL_android_main.c` in your project (comment out the line referencing "SDL_internal.h"). Compile it as C (not C++).
Line 260: Line 265:
PATH=/usr/src/ndk-standalone-12-arm/bin:$PATH PATH=$NDK_STANDALONE/bin:$PATH
Line 278: Line 283:
android update project --name your_app --path . --target "android-12" android update project --name your_app --path . --target android-XX
Line 301: Line 306:
PATH=/usr/src/ndk-standalone-12-arm/bin:$PATH PATH=$NDK_STANDALONE/bin:$PATH

Building SDL2 for Android

1. Existing documentation

A lot of information can be found in SDL/docs/README-android.md.

This page is more walkthrough-oriented.

2. Pre-requisites

  • Install minimal Java environment. For instance, in Debian/Ubuntu:

    sudo apt-get install openjdk-7-jdk ant
  • Install NDK (tested with r8c)

  • Install the latest SDK, run android and install one API (>=12)

  • Configure your environment variables, e.g.:

    PATH="/usr/src/android-ndk-r8c:$PATH"                   # for 'ndk-build'
    PATH="/usr/src/android-sdk-linux/tools:$PATH"           # for 'android'
    PATH="/usr/src/android-sdk-linux/platform-tools:$PATH"  # for 'adb'
  • Edit build-scripts/androidbuild.sh, find the android update project line, and add --target android-XX to it (replace XX with your installed API number above).

3. Simple builds

3.1. SDL wrapper for simple programs

  • Compile a sample app (calls ndk-build):

     cd /usr/src/SDL2/build-scripts/
     ./androidbuild.sh org.libsdl.testgles ../test/testgles.c
  • Follow the instructions to install on your device:

     cd /usr/src/SDL2/build/org.libsdl.testgles/
     ant debug install

Notes:

  • triple target armeabi/armeabi-v7a/x86 compilation!
  • application doesn't quit

3.2. SDL wrapper + SDL_image NDK module

Let's modify SDL2_image/showimage.c to show a simple embedded image (e.g. XPM).

Then let's make an Android app out of it. To compile:

 cd /usr/src/SDL2/build-scripts/
 ./androidbuild.sh org.libsdl.showimage /usr/src/SDL2_image/showimage.c
 cd /usr/src/SDL2/build/org.libsdl.showimage/
 ln -s /usr/src/SDL2_image jni/
 ln -s /usr/src/SDL2_image/external/libwebp-0.3.0 jni/webp
 # - Edit jni/src/Android.mk
 #   LOCAL_SHARED_LIBRARIES := ... SDL2_image
 # - Edit jni/Application.mk: remove x86 where jpeg-9 doesn't build
 ndk-build -j$(nproc)
 ant debug install

Notes:

  • application doesn't restart properly

4. Build an autotools-friendly environment

You use autotools in your project and can't be bothering understanding ndk-build's cryptic errors? This guide is for you!

Note: this environment can be used for CMake too.

4.1. Compile a shared binaries bundle for SDL and SDL_*

  • Start with a minimal build:

    cd /usr/src/SDL2/
    cd build-scripts/
    hg revert --all  # remove traces of previous builds
    # edit androidbuild.sh and modify android update project --target android-XX
    ./androidbuild.sh org.libsdl /dev/null
    # doesn't matter if the actual build fails, it's just for setup
    cd ../build/org.libsdl/
  • Remove reference to our dummy file:

    rm -rf jni/src/
  • Get the latests SDL2_* libs from Mercurial (they fix a few bugs):

    cd /usr/src/
    hg clone http://hg.libsdl.org/SDL_image SDL2_image
    hg clone http://hg.libsdl.org/SDL_mixer SDL2_mixer
    hg clone http://hg.libsdl.org/SDL_net   SDL2_net
    hg clone http://hg.libsdl.org/SDL_ttf   SDL2_ttf
  • Reference SDL_image, SDL_mixer, SDL_ttf, and their dependencies, as NDK modules:

    ln -s /usr/src/SDL2_image jni/
    ln -s /usr/src/SDL2_image/external/libwebp-0.3.0 jni/webp
    ln -s /usr/src/SDL2_mixer jni/
    ln -s /usr/src/SDL2_mixer/external/libmikmod-3.1.12 jni/libmikmod
    ln -s /usr/src/SDL2_mixer/external/smpeg2-2.0.0 jni/smpeg2
    ln -s /usr/src/SDL2_net jni/
    ln -s /usr/src/SDL2_ttf jni/
  • Optionnaly edit jni/Android.mk to disable some formats, e.g.:

    SUPPORT_MP3_SMPEG := false
    include $(call all-subdir-makefiles)
  • Launch the build!

    ndk-build -j$(nproc)

Note: no need to add System.loadLibrary calls in SDLActivity.java, your application will be linked to them and Android's Linux loads them automatically.

4.2. Install SDL in a GCC toolchain

Now:

  • Copy the NDK into a traditional GCC toolchain:

    /usr/src/android-ndk-r8c/build/tools/make-standalone-toolchain.sh \
      --platform=android-14 --install-dir=/usr/src/ndk-standalone-14-arm --arch=arm
  • Set your PATH (important, do it before any build):

    NDK_STANDALONE=/usr/src/ndk-standalone-14-arm
    PATH=$NDK_STANDALONE/bin:$PATH
  • Install the SDL2 binaries in the toolchain:

    cd /usr/src/SDL2/build/org.libsdl/
    for i in libs/armeabi/*; do ln -nfs $(pwd)/$i $NDK_STANDALONE/sysroot/usr/lib/; done
    mkdir $NDK_STANDALONE/sysroot/usr/include/SDL2/
    \cp jni/SDL/include/* $NDK_STANDALONE/sysroot/usr/include/SDL2/
    \cp jni/*/SDL*.h $NDK_STANDALONE/sysroot/usr/include/SDL2/
  • Install pkg-config and install a host-triplet-prefixed symlink in the PATH (auto-detected by autoconf):

    VERSION=0.9.12
    cd /usr/src/
    wget http://rabbit.dereferenced.org/~nenolod/distfiles/pkgconf-$VERSION.tar.gz
    tar xf pkgconf-$VERSION.tar.gz
    cd pkgconf-$VERSION
    mkdir native-android/ && cd native-android/
    ../configure --prefix=$NDK_STANDALONE/sysroot/usr
    make -j$(nproc)
    make install
    ln -s ../sysroot/usr/bin/pkgconf $NDK_STANDALONE/bin/arm-linux-androideabi-pkg-config
    mkdir $NDK_STANDALONE/sysroot/usr/lib/pkgconfig/
  • Install pkg-config .pc files for SDL:

    cat <<'EOF' > $NDK_STANDALONE/sysroot/usr/lib/pkgconfig/sdl2.pc
    prefix=/usr/src/ndk-standalone-14-arm/sysroot/usr
    exec_prefix=${prefix}
    libdir=${exec_prefix}/lib
    includedir=${prefix}/include
    Name: sdl2
    Description: Simple DirectMedia Layer is a cross-platform multimedia library designed to provide low level access to audio, keyboard, mouse, joystick, 3D hardware via OpenGL, and 2D video framebuffer.
    Version: 2.0.2.scm
    Requires:
    Conflicts:
    Libs: -lSDL2
    Cflags: -I${includedir}/SDL2   -D_REENTRANT
    EOF
    
    cat <<'EOF' > $NDK_STANDALONE/sysroot/usr/lib/pkgconfig/SDL2_image.pc
    prefix=/usr/src/ndk-standalone-14-arm/sysroot/usr
    exec_prefix=${prefix}
    libdir=${exec_prefix}/lib
    includedir=${prefix}/include
    Name: SDL2_image
    Description: image loading library for Simple DirectMedia Layer
    Version: 2.0.0.scm
    Requires: sdl2 >= 2.0.0
    Libs: -L${libdir} -lSDL2_image
    Cflags: -I${includedir}/SDL2
    EOF
    
    cat <<'EOF' > $NDK_STANDALONE/sysroot/usr/lib/pkgconfig/SDL2_mixer.pc
    prefix=/usr/src/ndk-standalone-14-arm/sysroot/usr
    exec_prefix=${prefix}
    libdir=${exec_prefix}/lib
    includedir=${prefix}/include
    Name: SDL2_mixer
    Description: mixer library for Simple DirectMedia Layer
    Version: 2.0.0.scm
    Requires: sdl2 >= 2.0.0
    Libs: -L${libdir} -lSDL2_mixer
    Cflags: -I${includedir}/SDL2
    EOF
    
    cat <<'EOF' > $NDK_STANDALONE/sysroot/usr/lib/pkgconfig/SDL2_net.pc
    prefix=/usr/src/ndk-standalone-14-arm/sysroot/usr
    exec_prefix=${prefix}
    libdir=${exec_prefix}/lib
    includedir=${prefix}/include
    Name: SDL2_net
    Description: net library for Simple DirectMedia Layer
    Version: 2.0.0.scm
    Requires: sdl2 >= 2.0.0
    Libs: -L${libdir} -lSDL2_net
    Cflags: -I${includedir}/SDL2
    EOF
    
    cat <<'EOF' > $NDK_STANDALONE/sysroot/usr/lib/pkgconfig/SDL2_ttf.pc
    prefix=/usr/src/ndk-standalone-14-arm/sysroot/usr
    exec_prefix=${prefix}
    libdir=${exec_prefix}/lib
    includedir=${prefix}/include
    Name: SDL2_ttf
    Description: ttf library for Simple DirectMedia Layer with FreeType 2 support
    Version: 2.0.12.scm
    Requires: sdl2 >= 2.0.0
    Libs: -L${libdir} -lSDL2_ttf
    Cflags: -I${includedir}/SDL2
    EOF

4.3. Building other dependencies

You can add any other libraries (e.g.: SDL2_gfx, freetype, gettext, gmp...) using commands like:

mkdir cross-android/ && cd cross-android/
../configure --host=arm-linux-androideabi --prefix=$NDK_STANDALONE/sysroot/usr \
  --with-some-option --enable-another-option \
  --disable-shared
make -j$(nproc)
make install

Static builds (--disable-shared) are recommended for simplicity (no additional .so to declare).

Example with SDL2_gfx:

VERSION=1.0.1
wget http://www.ferzkopp.net/Software/SDL2_gfx/SDL2_gfx-$VERSION.tar.gz
tar xf SDL2_gfx-$VERSION.tar.gz
mv SDL2_gfx-$VERSION/ SDL2_gfx/
cd SDL2_gfx/
mkdir cross-android/ && cd cross-android/
../configure --host=arm-linux-androideabi --prefix=$NDK_STANDALONE/sysroot/usr \
  --disable-shared --disable-mmx
make -j$(nproc)
make install

You can compile YOUR application using this technique, with some more steps to tell Android how to run it using JNI.

4.4. Build your autotools app

First, prepare an Android project:

  • Copy and adapt the /usr/src/SDL2/android-project skeleton as explained in README-android.md. You can leave it as-is in a first step.

  • Make links to the SDL binaries as well:

    mkdir -p libs/armeabi/
    for i in /usr/src/SDL2/build/org.libsdl/libs/armeabi/*; do ln -nfs $i libs/armeabi/; done

Make your project Android-aware:

  • Add /usr/src/SDL2/src/main/android/SDL_android_main.c in your project (comment out the line referencing "SDL_internal.h"). Compile it as C (not C++).

  • In your configure.ac, detect Android:

    AM_CONDITIONAL(ANDROID, test "$host" = "arm-unknown-linux-androideabi")
  • In your Makefile.am, tell Automake you'll build executables as libraries, using something like:

    if ANDROID
      # Build .so JNI libs rather than executables
      AM_CFLAGS = -fPIC
      AM_LDFLAGS += -shared
      COMMON_OBJS += SDL_android_main.c
    endif
  • Cross-compile your project using the GCC toolchain environment we created:

    PATH=$NDK_STANDALONE/bin:$PATH
    mkdir cross-android/ && cd cross-android/
    ../configure --host=arm-linux-androideabi \
      --with-your-option --enable-your-other-option ...
    make
  • Do this again for any additional arch you want to support (TODO: see how to support armeabi-v7a and document what devices support it); something like:

    mkdir cross-android-v7a/ && cd cross-android-v7a/
    # .o: -march=armv5te -mtune=xscale -msoft-float -mthumb  =>  -march=armv7-a -mfpu=vfpv3-d16 -mfloat-abi=softfp -mthumb
    # .so: -march=armv7-a -Wl,--fix-cortex-a8
    CFLAGS="-g -O2 -march=armv7-a -mfpu=vfpv3-d16 -mfloat-abi=softfp -mthumb" LFDLAGS="-march=armv7-a -Wl,--fix-cortex-a8" \
      ../configure --host=arm-linux-androideabi \
      ...

Now you can install your pre-built binaries and build the Android project:

  • Copy your program in android-project/libs/armeabi/libmain.so.

  • Build your Android .apk:

    android update project --name your_app --path . --target android-XX
    ant debug
    ant installd
  • You can run the application remotely:

    adb shell am start -a android.intenon.MAIN -n org.libsdl.app/org.libsdl.app.SDLActivity  # replace with your app package
  • Your SDL2 Android app is running!

4.5. Build your CMake app

(Work In Progress)

You can use our Android GCC toolchain using a simple toolchain file:

# CMake toolchain file
SET(CMAKE_SYSTEM_NAME Linux)  # Tell CMake we're cross-compiling
include(CMakeForceCompiler)
# Prefix detection only works with compiler id "GNU"
CMAKE_FORCE_C_COMPILER(arm-linux-androideabi-gcc GNU)
SET(ANDROID TRUE)

You then call CMake like this:

PATH=$NDK_STANDALONE/bin:$PATH
cmake \
  -D CMAKE_TOOLCHAIN_FILE=../android_toolchain.cmake \
  ...

None: Android (last edited 2018-11-21 16:00:50 by SylvainBeucler)

Feedback
Please include your contact information if you'd like to receive a reply.
Submit