Skip to content

Instantly share code, notes, and snippets.

@DanielSerdyukov
Created February 27, 2016 18:02
Show Gist options
  • Star 8 You must be signed in to star a gist
  • Fork 4 You must be signed in to fork a gist
  • Save DanielSerdyukov/188d47e29150622352f1 to your computer and use it in GitHub Desktop.
Save DanielSerdyukov/188d47e29150622352f1 to your computer and use it in GitHub Desktop.
Build ICU for Android

Build ICU for Android

Prepare cross build environment

cd icu && mkdir linux && cd linux

../source/runConfigureICU Linux --prefix=$PWD/prebuilts \
    CFLAGS="-Os"
    CXXFLAGS="--std=c++11" \
    --enable-static \
    --enable-shared=no \
    --enable-extras=no \
    --enable-strict=no \
    --enable-icuio=no \
    --enable-layout=no \
    --enable-layoutex=no \
    --enable-tools=no \
    --enable-tests=no \
    --enable-samples=no \
    --enable-dyload=no

make -j5

Prepare build environment for each build

export CROSS_BUILD_DIR=$(realpath ../linux)

export ANDROID_NDK=/usr/local/opt/android-ndk

export ANDROID_TOOLCHAIN=$(pwd)/toolchain

export PATH=$ANDROID_TOOLCHAIN/bin:$PATH

Make standalone toolchain and build armv7a library

cd ../ && mkdir armv7a && cd armv7a

$ANDROID_NDK/build/tools/make-standalone-toolchain.sh \
    --platform=android-15 \
    --install-dir=$ANDROID_TOOLCHAIN \
    --toolchain=arm-linux-androideabi-4.9 \
    --llvm-version=3.6

../source/configure --prefix=$(pwd)/prebuilt \
    --host=arm-linux-androideabi \
    --enable-static \
    --enable-shared=no \
    --enable-extras=no \
    --enable-strict=no \
    --enable-icuio=no \
    --enable-layout=no \
    --enable-layoutex=no \
    --enable-tools=no \
    --enable-tests=no \
    --enable-samples=no \
    --enable-dyload=no \
    -with-cross-build=$CROSS_BUILD_DIR \
    CFLAGS='-Os -march=armv7-a -mfloat-abi=softfp -mfpu=neon' \
    CXXFLAGS='--std=c++11 -march=armv7-a -mfloat-abi=softfp -mfpu=neon' \
    LDFLAGS='-march=armv7-a -Wl,--fix-cortex-a8' \
    CC=arm-linux-androideabi-clang \
    CXX=arm-linux-androideabi-clang++ \
    AR=arm-linux-androideabi-ar \
    RINLIB=arm-linux-androideabi-ranlib \
    --with-data-packaging=archive

make -j5 && make install

Make standalone toolchain and build x86 library

cd ../ && mkdir x86 && cd x86

$ANDROID_NDK/build/tools/make-standalone-toolchain.sh \
    --platform=android-15 \
    --install-dir=$ANDROID_TOOLCHAIN \
    --toolchain=x86-4.9 \
    --llvm-version=3.6

../source/configure --prefix=$(pwd)/prebuilt \
    --host=i686-linux-android \
    --enable-static \
    --enable-shared=no \
    --enable-extras=no \
    --enable-strict=no \
    --enable-icuio=no \
    --enable-layout=no \
    --enable-layoutex=no \
    --enable-tools=no \
    --enable-tests=no \
    --enable-samples=no \
    --enable-dyload=no \
    -with-cross-build=$CROSS_BUILD_DIR \
    CFLAGS='-Os -march=i686 -mtune=intel -mssse3 -mfpmath=sse -m32' \
    CXXFLAGS='--std=c++11 -march=i686 -mtune=intel -mssse3 -mfpmath=sse -m32' \
    CC=i686-linux-android-clang \
    CXX=i686-linux-android-clang++ \
    AR=i686-linux-android-ar \
    RINLIB=i686-linux-android-ranlib \
    --with-data-packaging=archive

make -j5 && make install

Make standalone toolchain and build aarch64 library

cd ../ && mkdir aarch64 && cd aarch64

$ANDROID_NDK/build/tools/make-standalone-toolchain.sh \
    --platform=android-21 \
    --install-dir=$ANDROID_TOOLCHAIN \
    --toolchain=aarch64-linux-android-clang3.6

../source/configure --prefix=$(pwd)/prebuilt \
    --host=aarch64-linux-android \
    --enable-static \
    --enable-shared=no \
    --enable-extras=no \
    --enable-strict=no \
    --enable-icuio=no \
    --enable-layout=no \
    --enable-layoutex=no \
    --enable-tools=no \
    --enable-tests=no \
    --enable-samples=no \
    --enable-dyload=no \
    -with-cross-build=$CROSS_BUILD_DIR \
    CFLAGS='-Os' \
    CXXFLAGS='--std=c++11' \
    CC=aarch64-linux-android-clang \
    CXX=aarch64-linux-android-clang++ \
    AR=aarch64-linux-android-ar \
    RINLIB=aarch64-linux-android-ranlib \
    --with-data-packaging=archive

make -j5 && make install
@silvioprog
Copy link

Thanks for this script. Could you mention the ICU library URL and version that worked with this script?

@ceztko
Copy link

ceztko commented May 24, 2019

No doubt you were able to compile it, but it seems there are some mistakes left:

  1. RINLIB=i686-linux-android-ranlib -> RANLIB=i686-linux-android-ranlib
  2. -with-cross-build -> --with-cross-build

In the preparation with runConfigureICU also the prefix is "--prefix=$PWD/prebuilts", while in the actual configure it's
"--prefix=$PWD/prebuilt" without final "s". It is intended? How the configure will actually use the prebuilts?

@alexandrkirilov
Copy link

Does anyone know how to build libicudata part of this library? This script doesn't build it. Just short version of it.

@Ujjwal21
Copy link

@DanielSerdyukov @silvioprog @ceztko @alexandrkirilov can anyone please help for x86_64 ABI. I tried with similar script for x86_64, but I am getting incompatible target error. Seems like I am messing some flags. I used x86 script and changed

  1. march=i686-> x86_64
  2. -m32-> -m64

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment