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

投稿者: | 2010年8月8日

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ファイルしかありませんでした。

Android NDK の使用とapkファイルへの入れ方」への2件のフィードバック

  1. ピンバック: Tweets that mention Android NDK の使用とapkファイルへの入れ方 - 記録 -- Topsy.com

  2. ピンバック: Twitted by nharuki

コメントを残す

メールアドレスが公開されることはありません。