Ubuntu で Android NDK を使ってみる
このページでは,次のことを行う.
- Android NDK のダウンロードとインストール
- Android NDK に同封のサンプルプログラムのコンパイル
- (オプション)Android toolchain のビルド
- (オプション)Eclipse で Android NDK に同封のサンプルプログラムを動かしてみる
- (オプション)Eclipse で Android プロジェクトを作成し,Android NDK を使ってみる
Java Platform (JDK) のインストール
前準備として,Java Platform (JDK) のインストールが済んでいること.
- Java Platform (JDK) のインストール
◆ Ubuntu 12.04 での実行手順例
sudo add-apt-repository -y ppa:webupd8team/java sudo apt -y update sudo apt -y install oracle-java8-installer sudo apt -y install oracle-java8-set-default java -version
- Oracle (SUN) JDK を使うように設定
sudo update-java-alternatives --jre -s java-8-oracle sudo update-java-alternatives --jre-headless -s java-8-oracle sudo update-java-alternatives -s java-8-oracle
- 設定の確認
次のコマンドを実行.し、/usr/lib/jvm/java-8-oracle...の行に設定されていることを確認する
sudo update-alternatives --config java
- java のバージョンの確認
update-java-alternatives -l java -version
- 変数 JAVA_HOME の設定
~/.bashrc または ~/.bash_profile に次のように設定(設定例)
export JAVA_HOME=/usr/lib/jvm/java-8-oracle export PATH=/usr/lib/jvm/java-8-oracle/bin:$PATH export CLASSPATH=.:/usr/lib/jvm/java-8-oracle/lib
前準備として,下記のインストールが済んでいること.
- (オプション) Eclipse, Eclipse の プラグイン Android Development Tools のインストール が終わっていること
- (オプション) Eclipse に C/C++ 開発ツール (CDT) のインストール が終わっていること
Android NDK のダウンロードとインストール
- Web ページを開く
- Linux 版を選ぶ
クリックするとダウンロードが始まる。
- ライセンス条項の確認
熟読し、納得できる場合にのみ続行する.
- 分かりやすいディレクトリで、ダウンロードしたファイルを展開(解凍)
ダウンロードしたファイルは,分かりやすいところに解凍 (ここでは,/usr/localと書いています).
* 32 ビット Linux では 「x86」
cd /usr/local sudo tar -xvjof /tmp/android-ndk32-r10b-linux-x86.tar.bz2
* 64 ビット Linux では 「x86_64」
cd /usr/local sudo tar -xvjof /tmp/android-ndk32-r10b-linux-x86_64.tar.bz2
- 所有権の設定
sudo chown -R $USER:$USER /usr/local/android-ndk-r10b
- 変数 PATH, NDKROOT の設定
ndk-build コマンドなどにパスを通す操作.
cd echo 'export PATH=$PATH:/usr/local/android-ndk-r10b' >> .bashrc echo 'export NDKROOT=/usr/local/android-ndk-r10b' >> .bashrc
Android NDK に同封のサンプルプログラムのコンパイル
- cd /usr/local/android-ndk-r10b/samples/hello-jni
cd /usr/local/android-ndk-r10b/samples/hello-jni
- ndk-build コマンドの実行
ndk-build
◆ 実行結果の例
- 「.so」ファイルができる.
ls -al obj/local/armeabi
書きかけ Android ツールチェーン (toolchain) のビルド
「Android ツールチェーン (toolchain) のビルド」の説明は書きかけです* 例1
- 使用するAndroid NDK のディレクトリ: /usr/local/android-ndk-r10b
- Android のバージョン: android-19
- ツールチェーン・アーキテクチャ: x86-4.8
- Android ツールチェーン (toolchain) のインストール先: /usr/local/android-ndk-r10b/prebuilt/linux-x86_64
export SYSROOT=/usr/local/android-ndk-r10b/platforms/android-19/arch-x86
/usr/local/android-ndk-r10b/build/tools/make-standalone-toolchain.sh --verbose --toolchain=x86-4.8 --install-dir=/usr/local/android-ndk-r10b/prebuilt/linux-x86_64 --ndk-dir=/usr/local/android-ndk-r10b --platform=android-19
ls -al /usr/local/android-ndk-r10b/prebuilt/linux-x86_64/lib

* 例2
- 使用するAndroid NDK のディレクトリ: /usr/local/android-ndk-r10b
- Android のバージョン: android-17
- ツールチェーン・アーキテクチャ: x86-4.8
- Android ツールチェーン (toolchain) のインストール先: /usr/local/android-ndk-r10b/prebuilt/linux-x86_64
export SYSROOT=/usr/local/android-ndk-r10b/platforms/android-17/arch-x86
/usr/local/android-ndk-r10b/build/tools/make-standalone-toolchain.sh --verbose --toolchain=x86-4.8 --install-dir=/usr/local/android-ndk-r10b/prebuilt/linux-x86_64 --ndk-dir=/usr/local/android-ndk-r10b --platform=android-17
ls -al /usr/local/android-ndk-r10b/prebuilt/linux-x86_64/lib

* 例3
- 使用するAndroid NDK のディレクトリ: /usr/local/android-ndk-r10b
- Android のバージョン: android-19
- ツールチェーン・アーキテクチャ: arm-linux-androideabi-4.8
- Android ツールチェーン (toolchain) のインストール先: /usr/local/android-ndk-r10b/prebuilt/linux-x86_64
export SYSROOT=/usr/local/android-ndk-r10b/platforms/android-19/arch-arm
/usr/local/android-ndk-r10b/build/tools/make-standalone-toolchain.sh --verbose --toolchain=arm-linux-androideabi-4.8 --install-dir=/usr/local/android-ndk-r10b/prebuilt/linux-x86_64 --ndk-dir=/usr/local/android-ndk-r10b --platform=android-19
ls -al /usr/local/android-ndk-r10b/prebuilt/linux-x86_64/lib

* 例4
- 使用するAndroid NDK のディレクトリ: /usr/local/android-ndk-r10b
- Android のバージョン: android-17
- ツールチェーン・アーキテクチャ: arm-linux-androideabi-4.8
- Android ツールチェーン (toolchain) のインストール先: /usr/local/android-ndk-r10b/prebuilt/linux-x86_64
export SYSROOT=/usr/local/android-ndk-r10b/platforms/android-17/arch-arm
/usr/local/android-ndk-r10b/build/tools/make-standalone-toolchain.sh --verbose --toolchain=arm-linux-androideabi-4.8 --install-dir=/usr/local/android-ndk-r10b/prebuilt/linux-x86_64 --ndk-dir=/usr/local/android-ndk-r10b --platform=android-17
ls -al /usr/local/android-ndk-r10b/prebuilt/linux-x86_64/lib

Eclipse の設定
- Java コンパイラーの準拠レベルの確認
1.6 に設定しておく(1.7 を使いたい場合には 4.4 以上の Android SDK が必要)
- Android NDK のパスに関する設定
Eclipse で Android NDK に同封のサンプルプログラムを動かしてみる
ここでは,インストールがうまくできたことの確認のため, さきほど、ビルドを済ませた hello-jni(Android NDK に同封のサンプルプログラム) のファイルをまるごと Eclipse のワークスペースに取り込んで実行する.
- Eclipse の起動
-
「ファイル (File)」
→
「新規 (New)」
→
「プロジェクト (Project)」 と操作する
- 既存コードからの Android プロジェクト (Android Project from Existing Code) を選ぶ
- プロジェクトのインポートに関する設定を行う.
「ルート・ディレクトリー」として「/usr/local/android-ndk-r10b/samples/hello-jni」を指定する.
「プロジェクトをワークスペースにコピー (Copy projects into workspace)」にチェックし、「Finish」をクリックする
* hello-jni は、先ほどコマンドプロンプトで ndk-build を実行して、ビルド済み
- 実行してみる (エミュレータにデプロイ)
プロジェクトを右クリックし, 「実行 (Run)」 → 「Android Application」
しばらく待つと, エミュレータの画面に「Hello from JNI!」というメッセージが現れる.
コンソールに、エラーメッセージが出ていないことを確認する
JNI プログラムの ビルドが Eclipse で行えるようにするための設定
Windows のコマンドプロンプトを開いて ndk-build コマンドを実行するのが面倒(Eclipse ndk-build コマンドの起動が行えるように設定したい)ので、次のように操作する.
-
先ほど使ったプロジェクト HelloJni を右クリックし,「Android ツール」を選び、
「ネイティブサポートの追加 (Add Native Support)」
- libhello-jni.so に設定
- プロジェクトを右クリックし、
「プロジェクトをクリーン」、「プロジェクトをビルド」と操作
- コンソールに ndk-build の実行結果が出るので確認する
* コンソールにエラーメッセージが無いのに、エラーメッセージが出る場合がある.
もともとサンプルプログラムを使っているので、エラーメッセージが出るはずが無い. なのに、エラーメッセージが出る.どうやら Eclipse の設定が甘い(が、どうしたらよいか分からない). エラーメッセージが出たせいで、実行ができないという Eclipse のおせっかい機能.
このときは Eclipse を再起動するとうまくいく場合がある.
- 実行してみる (エミュレータにデプロイ)
プロジェクトを右クリックし, 「実行 (Run)」 → 「Android Application」
しばらく待つと, エミュレータの画面に「Hello from JNI!」というメッセージが現れる.
コンソールに、エラーメッセージが出ていないことを確認する
C プログラムの編集、ビルドが Eclipse で行えるようにするための設定
Eclipse 上で ndk-build の操作ができるようにしたいので, 「Convert to a C/C++ Porject (Adds C/C++ Nature)」を実行する.
- まず,「ファイル (File)」 → 「新規 (New)」 → 「その他 (Other)」
-
C/C++
→
C/C++ プロジェクトへ変換 (C/C++ ネーチャー追加) (Convert to a C/C++ Porject (Adds C/C++ Nature))と操作する
- Makefile プロジェクト (Makefile project) を選び,「他のツールチェーン (Other Toolchain)」を選ぶ.Finish をクリック
これは、操作を間違えると、やり直すのがとても面倒なので、注意深く行う
- パースペクティブに関する確認
- プロパティーの設定
プロジェクトを右クリックし,「プロパティー」を選ぶ.設定用のウインドウが現れる.
- 「C/C++ ビルド (C/C++ Build)」の「ビルダー設定 (Builder Settings)」タブ
の
ビルドコマンドを
「${NDKROOT}/ndk-build」のように設定
◆ ビルドコマンドの設定例
- Linux, MacOS の場合: 「${NDKROOT}/ndk-build」
- Windows の場合: 「${NDKROOT}/ndk-build.cmd」
◆ 環境変数 NDKROOT は、別のところで設定しておくこと. 例えば .bashrc に「 export NDKROOT=/usr/local/android-ndk-r10b 」のように設定するなど.
◆ 環境変数 NDKROOTの設定を忘れると、Eclipse のコンソールに次のようなエラーメッセージが出る
- 「振る舞い (Behaviour)」は、リソース保管時のインストール(自動ビルド)をチェックする
- 今度は、「C/C++ 一般 (C/C++ General)」の「パスおよびシンボル (Paths and Symbols)」を開き,
「インクルード (Includes)」が次を含むように設定する
${NDKROOT}/platforms/android-9/arch-arm/usr/include ${NDKROOT}/sources/cxx-stl/gnu-libstdc++/4.6/include ${NDKROOT}/sources/cxx-stl/gnu-libstdc++/4.6/libs/armeabi-v7a/include /usr/local/OpenCV-2.4.5-android-sdk/sdk/native/jni/include
Eclipse での Android プロジェクト作成と実行
- Eclipse の起動
- Eclipse で,次のような Android プロジェクトを新規作成
- プロジェクト名: Hello2
- パッケージ名: hoge.hoge.com
- アクティビティ: MainActivity または FullscreenActivity
-
「ファイル (File)」
→
「新規 (New)」
→
「プロジェクト (Project)」 と操作する
- Android アプリケーションプロジェクト (Android Application Project) を選ぶ
- アプリケーション名を「Hello2」のように設定する.
パッケージ名は 「hoge.hoge.com」のように設定
- 設定
「ワークスペース内にプロジェクトを作成」をチェックする.
- 設定
- アクティビティーの作成
- アクティビティー名の設定
- Eclipse のプロジェクト・エクスプローラーで,新しいフォルダとして「jni」を作成
- jni/Android.mk の作成
新しいファイル Android.mk を作成する.
Android.mk を次のように編集する
LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) LOCAL_MODULE := hello LOCAL_SRC_FILES := hello.c include $(BUILD_SHARED_LIBRARY)
- jni/hello.c の作成
Eclipse のプロジェクト・エクスプローラーで, 新しいファイルとして hello.c を作成する.hello.c を次のように編集する
* ファイル名「hello.c」のところは何でもよいが、Android.mk で、そのファイル名を正しく設定しておくこと.
関数名は、「Java_<パッケージ名>_<アクティビティ名>_<文字列>」のようになる
#include<string.h> #include<jni.h> jstring Java_hoge_hoge_com_MainActivity_stringFromJNI( JNIEnv* env, jobject thiz ) { return (*env)->NewStringUTF(env, "Hello, World!\n"); }
-
アクティビティ: MainActivity または FullscreenActivityの編集
Android.mk で「hello.c」のように設定したので,「System.loadLibrary("hello");」のところは「hello」になる.
◆ アクティビティ: MainActivity の設定例
import android.widget.TextView;
public native String stringFromJNI(); public native String unimplementedStringFromJNI(); static { System.loadLibrary("hello"); }
TextView tv = new TextView(this); tv.setText( stringFromJNI() ); setContentView(tv);
◆ アクティビティ: FullscreenActivity の設定例
import android.widget.TextView;
public native String stringFromJNI(); public native String unimplementedStringFromJNI(); static { System.loadLibrary("hello"); }
TextView tv = new TextView(this); tv.setText( stringFromJNI() ); setContentView(tv);
- C/C++ プロジェクトへ変換 (C/C++ ネーチャー追加)
Eclipse 上で ndk-build の操作ができるようにしたいので, プロジェクトを右クリックし、 「新規 (New)」 → 「その他 (Other)」 と操作する.
その後、C/C++ → C/C++ プロジェクトへ変換 (C/C++ ネーチャー追加) (Convert to a C/C++ Porject (Adds C/C++ Nature))と操作する
- Makefile プロジェクト (Makefile project) を選び,「他のツールチェーン (Other Toolchain)」を選ぶ.Finish をクリック
これは、操作を間違えると、やり直すのがとても面倒なので、注意深く行う
- パースペクティブに関する確認
- プロパティーの設定
プロジェクトを右クリックし,プロパティーを選ぶ.設定用のウインドウが現れるので,
「C/C++ ビルド (C/C++ Build)」の の ビルドコマンドを 「ndk-build」のように設定
- インクルード・ディレクトリーの設定
- AndroidManifest.xml の minSDK
Android NDK が android 14 以上でないと動かない、というようなエラーメッセージが出た場合には次のように修正
- 実行してみる