AndroidでC言語のライブラリのビルド方法のまとめ

AndroidLinux の一種でもあり、ARM で動く Linux 向けのC言語で書かれたライブラリの多くが動きます。(多少違うので、動かない場合もあり)。ただし、ビルド方法が暗黙の了解事項になってたりして、Android NDK にちゃんと書かれていなかったりするので、ここにまとめます!

以下、架空の libhoge をビルドすることとします。

ビルド対象は一般的に静的ライブラリ (.a) ファイルにしておくと吉です。自分で使う際は、自分の Android.mk に以下の物を追加します。

  • LOCAL_CFLAGS に -Ihoge-1.0/include みたいのを追加
  • LOCAL_LDLIBS に -Lhoge-1.0-android-build/$(TARGET_ARCH_ABI) と -l hoge を追加

ライブラリをビルドしてできた libhoge.a はこのフォルダに置いておきます。

必要な物:

手順は以下の順番で検討していくと良いです。

1.Android でのビルド方法がライブラリに明示されている場合

当然、このケースは、ライブラリに従うとビルドできるはずです。

2.Android.mk だけが用意されている場合

export NDK_ROOT=~/android-ndk-r9c
cd ~/hoge-1.0
$NDK_ROOT/ndk-build NDK_PROJECT_PATH=. APP_BUILD_SCRIPT=./Android.mk APP_ABI=armeabi obj/local/armeabi/libhoge.a
$NDK_ROOT/ndk-build NDK_PROJECT_PATH=. APP_BUILD_SCRIPT=./Android.mk APP_ABI=armeabi-v7a obj/local/armeabi-v7a/libhoge.a
$NDK_ROOT/ndk-build NDK_PROJECT_PATH=. APP_BUILD_SCRIPT=./Android.mk APP_ABI=x86 obj/local/x86/libhoge.a

obj/local にできたやつがコンパイル結果です。

3.なにもなくて、gcc の標準のビルドスタイルの場合

./configure → make → make install のパターンの場合です。

まず、スタンドアローンツールチェインをインストールする必要があります。Android NDK の docs/STANDALONE-TOOLCHAIN.html に説明が書いてあります。以下、android-9 にしたので、Android 2.3 用です。

export NDK_ROOT=~/android-ndk-r9c
$NDK_ROOT/build/tools/make-standalone-toolchain.sh --platform=android-9 --toolchain=arm-linux-androideabi-4.6 --install-dir=$HOME/android-toolchain-arm-4.6
$NDK_ROOT/build/tools/make-standalone-toolchain.sh --platform=android-9 --toolchain=x86-4.6 --install-dir=$HOME/android-toolchain-x86-4.6

さて、ビルド方法。以下、configure が置いてある元のソースフォルダを汚さないように別のフォルダを作ってビルドします。ソースは ~/hoge-1.0 とかに展開してあるとします。

export ANDROID_TOOLCHAIN=~/android-toolchain-arm-4.6
export BUILD_HOST=arm-linux-androideabi

export PATH=$ANDROID_TOOLCHAIN/bin:$PATH
export CC=$BUILD_HOST-gcc
export CFLAGS="-mthumb -march=armv7-a -mfloat-abi=softfp -I$ANDROID_TOOLCHAIN/include"
export LDFLAGS="-Wl,--fix-cortex-a8"

mkdir ~/hoge-1.0-android
cd ~/hoge-1.0-android
../hoge-1.0/configure --host=$BUILD_HOST --prefix=$PWD/build-result
make -j 4
make install

すると、~/hoge-1.0-android/build-result にビルド結果が作られるので、lib/libhoge.a を探してください。

上記の方法は、armeabi-v7a の方で Cortex-A シリーズでしか動かなく、このようにすると、armeabi になり、全ての Android で動くようになります。

export CFLAGS="-mthumb -march=armv5te -I$ANDROID_TOOLCHAIN/include"

また、NEON (Advanced SIMD) を有効にするには、このようにします。NVIDIA Tegra 2 で動かなくなります。

export CFLAGS="-mthumb -march=armv7-a -mfloat-abi=softfp -mfpu=neon -I$ANDROID_TOOLCHAIN/include"

ちなみに、configure の --host、arm-linux-androideabi ($BUILD_HOST) ですが、arm-linux にして Android であることを隠してしまうとうまくいく場合もあったりなかったりします。Android NDK r8b 現在、Elf32_auxv_t が未定義だったり、微妙に AndroidLinux と差があるんですが…

次に Android x86

export ANDROID_TOOLCHAIN=~/android-toolchain-x86-4.6
export BUILD_HOST=i686-linux-android

export PATH=$ANDROID_TOOLCHAIN/bin:$PATH
export CC=$BUILD_HOST-gcc
export CFLAGS="-I$ANDROID_TOOLCHAIN/include"
export LDFLAGS=""

mkdir ~/hoge-1.0-android-x86
cd ~/hoge-1.0-android-x86
../hoge-1.0/configure --host=$BUILD_HOST --prefix=$PWD/build-result
make -j 4
make install

同じく、~/hoge-1.0-android-x86/build-result にビルド結果が作られるので、lib/libhoge.a を探してください。