AndroidでC言語のライブラリのビルド方法のまとめ
Android は Linux の一種でもあり、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 はこのフォルダに置いておきます。
必要な物:
- Android NDK: http://developer.android.com/tools/sdk/ndk/index.html からダウンロード。インストール先は ~/android-ndk-r9c とします。
- Linux: Linux なくてもほとんどのケースで大丈夫ですが、ビルド用に Linux あったほうが楽です。
手順は以下の順番で検討していくと良いです。
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 が未定義だったり、微妙に Android は Linux と差があるんですが…
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 を探してください。