2011年8月24日水曜日

Android NDK の使用とapkファイルへの入れ方

Android NDK r4bを使っていろいろやってみてたのでちょっとまとめ。
(以下の内容はubuntu 10.04で使用した上で書いています。Macやwindows(cygwinが必要)だとちょっと違いがあるかも)
Android NDK
自分の理解では、Android NDKはネイティブ層アプリやライブラリのビルドを必要ソースのみで楽にビルドするためのツールです。
NDKを使わない場合ネイティブソースのビルドは、Androidのソースをgitで拾ってきてその中でmmコマンドなどを使ってビルドするのですが、NDKがあれば単体でビルドできます。
基本的使い方は、java層からJNIを使用した時に呼ばれるネイティブ層のライブラリを作るときに使用するもののようです。
 
単体ビルド
単体でビルドする場合、
~/project/jni/
というディレクトリを作成し、Android.mkとビルド対象ソースをここに配置。
NDKディレクトリにパスを通してprojectディレクトリにて
$ndk-build
とすると
~/project/libs/armeabi
というディレクトリの中にビルド後の生成物ができます。
ソースなど一式をjniディレクトリ以下に置いてビルドを行ないますが、
この手順ではJNIのための.soファイルだけでなく実行可能ファイルの作成も可能です。
 
Android.mkについて
Android.mkは、いわゆるmakeファイルです。
samples以下にある物を見ると書き方は大体わかると思います。
サンプルでは大体最後にあるこの部分を以下の3通りに書き換えることで生成されるバイナリを2種類のライブラリか実行ファイルにできます。
include $(BUILD_SHARED_LIBRARY)
を書くと.soファイルができます。
include $(BUILD_STATIC_LIBRARY)
では静的ライブラリの.aファイル
include $(BUILD_EXECUTABLE)
は実行可能ファイルになります。
ただ、ここで一つ問題が。BUILD_STATIC_LIBRARYを指定してスタティックライブラリのビルドをしようとすると、何も処理されずに終了します。
スタティックライブラリのみをビルドする場合には、Application.mkを作成し
APP_MODULES := module名
と書いてndk-buildを実行すればスタティックライブラリのみでもビルドができます。
 
apkファイルに入れる場合
eclipseのプロジェクトを開き、一緒にインストールしたいjavaアプリプロジェクトに
/libs/armeabi
というディレクトリを作り、その下に*.soファイルを置くことによりそのjavaアプリのapkファイル内に配置されます。
インストール先は端末の
/data/data/アプリ名/lib
以下になります。
この場合入れられる.soファイルは1つしか許容されていないらしく、2つ以上を置く場合にはどれか一つだけをBUILD_SHARED_LIBRARY指定にし、他をBUILD_STATIC_LIBRARYで静的ライブラリにして、共有ライブラリにするモジュールからリンクするという方法が必要になるようです。
NDKを展開したディレクトリにある samples/two-libs/jni/Android.mkが参考になります。
また、どうも.soファイル以外はapkファイルに入れられないようです。
sdkに入っているapkbuilderを使って無理やり.soと実行ファイルをapkに入れてみたんですが、インストール先のディレクトリには.soファイルしかありませんでした。

0 件のコメント:

コメントを投稿