Android NDKを使ってオープンソースのライブラリをビルドするには、Android.mkファイルを使ってビルドする他に、Android NDKのスタンドアローン環境を使ってビルドする方法もあります。
このスタンドアローン環境というのは、いわゆる「クロス開発環境」であり、オープンソースソフトウェアをビルドする際によく実行される「./configure; make」で、Android向けにライブラリがビルドできるのです。Android.mkファイルをわざわざ自前で用意する必要が無いので割とこの方法は好きなのですが。
スタンドアローンの環境の作り方は、$NDK_ROOT/docs/STANDALONE-CHAIN.htmlに書かれています。日本語では、Android NDK ネイティブプログラミングに(宣伝)
コンパイラの指定方法
この際に注意しないといけないのが、ソースコードのビルド時に使われるコンパイラなどの指定です。
標準ではPCにインストールされている標準のコンパイラを使ってビルドするmakefileが生成されます。つまり、Linux上でビルドするとLinux上で動作するファイルが生成されますね(一般的にはこの目的でビルドされる事が多いですし)
ただ、今回のようにLinux上でAndroid向けのライブラリをビルドしたいこともあるわけですよ。そんなとき、どうするか?実は、configure実行前に環境変数でコンパイラなどを指定しておくと、configureファイルがそれら環境変数で指定したコンパイラをmakefileに反映してくれるですね。賢い!
設定すべき環境変数
では環境変数には設定しておけばよいか? 例として、ARM向けのスタンドアローン環境を構築した際した場合はこんな風になります(ここでは、スタンドアローン環境は$HOME/arm-android-15-toolchainフォルダに構築されているものとします)
export CC=arm-linux-androideabi-gcc # Cコンパイラ export CXX=arm-linux-androideabi-g++ # C++ コンパイラ export AR=arm-linux-androideabi-ar # アーカイバ(静的ライブラリを生成するのに利用される) export AS=arm-linux-androideabi-as # アセンブラ export LD=arm-linux-androideabi-ld # リンカ export RANLIB=arm-linux-androideabi-ranlib # アーカイバ export PATH=$HOME/arm-android-15-toolchain/bin:$PATH
特にARやRANLIBが設定されていないと、標準のARやRANLIBでアーカイブされたファイルが生成されてしまって、Android NDKで生成したモジュールとリンクする際に「no archive symbol table (run ranlib) 」といったエラーが出てしまうことがあります。