opamp_sando's blog

クソザコが割りと適当なことを書くためにある備忘録です。あとたまに普通の日記も書きます

本屋で立ち読みした本を思い出しつつAndroid向けにCライブラリをクロスコンパイル

タイトルが長い。
とりあえず、今日本屋でNDKの本を立ち読みして覚えてきたのでメモしておく。本当に使えるかはまだちょっと検証してない。
頑張ってgccを独自でビルドしてクロスコンパイラを作っていた時間帯がつい数日前まであったけど今日はandroid ndkのgccを使う方法。

とりあえずNDKなどがインストールされているのは前提条件として...

make-standalone-toolchain.shを走らせる

まず、NDKのあるディレクトリを環境変数にとっておくといいみたい。

$ export NDK=<path to ndk's root directory>

では早速このスクリプトを走らせる。以下のようにする

$ $NDK/build/tools/make-standalone-toolchain.sh --platform=android-14 --install-dir=<path to toolchain install dir>

platformにはandroidのtargetの奴を記述する。4.0系以降ならandroid-14でおk。
次の"--install-dir"にはtoolchainをインストールする先のディレクトリを指定する。
ここにarm向けgccなどが配置される。

環境変数を色々設定する

環境変数を調整する。次に

$ export SYSROOT=$NDK/platforms/android-14/arch-arm

$ export CC=arm-linux-androideabi-gcc

をする。
ところでSYSROOTのところはarch-arm以外にもいろいろあるのだが、arch-x86などを使う方法もあるんだろうか?
これに関しては後々探ってみる必要があるきがする。

最後にPATHを通す。もともと通ってるPATHが消えないように、例えばzshbashなら以下のようにする。

$ export PATH=<path to toolchain install dir>/bin:"$PATH"

と、先ほど生成したtoolchainが入っているディレクトリ以下のbinディレクトリを指定する。

実際にコンパイルしてみる

適当にopusでもコンパイルしてみる。

$ curl -O http://downloads.xiph.org/releases/opus/opus-1.0.2.tar.gz

で落としてきて展開して以下のコマンドでconfigureしてmake -> make installしてみる。

$ configure --prefix=<path> --host=x86_64-apple-darwin11.4.2 --target=arm-linux-androideabi --with-sysroot=$SYSROOT CC=$CC &&make

ビルドが通ったら

$ make install

してconfigureで指定したにインストール。

※CMakeを使ってビルドするライブラリについては以下のコマンドでビルドできる。(できないのもある)

$ cmake -DCMAKE_C_COMPILER=arm-linux-androideabi-gcc -DCMAKE_SYSTEM_NAME=arm-linux-androideabi -DCMAKE_INSTALL_PREFIX=<path> . &&make

zlibはこれでビルドできたがopenjpegは無理だった。openjpegはソースを取り出してCMakeLists.txtをAndroid.mkに書き換えるとある程度ビルドできる(実はopenjpegを使ってjpeg2000androidで表示する実験プロジェクトをやっててだな)

確認?

適当に生成されたlibopus.dylibなどをfileコマンドでチェックすると...

$ file libopus.dylib
libopus.dylib: ELF 32-bit LSB shared object, ARM, version 1 (SYSV), dynamically linked, not stripped

となっている。LSBだし32bitのARMだし。ここを見る限り問題無さそう。

ちなみに、外部ライブラリは可能ならstaticリンクにしたほうがいいかもしれないねってビルドして気づいた。まあ、staticライブラリもちゃんとコンパイルされてるけど。

実際にアプリ中から呼び出せるかは試してないが表示の上ではとりあえずちゃんとコンパイルができたようだ。


サンプルがてらビルドしたzlibを貼ってみる。使えるかは謎。
ダウンロード

どうでもいいけど、その本は今日センター帰りに本屋で立ち読みしてきた。(物理やらかしたorz)

Android NDK ネイティブプログラミング

Android NDK ネイティブプログラミング


確かこの本だったような... 違っていたらすみませんorz

Firefox ブラウザ無料ダウンロード