NDK環境構築&Getting Startedメモ
NDK環境作ってGetting Startedのメモ。
といってもドキュメントにあるとおり、インストールは「straightforward」で「involves extracting」するだけな感じ。
さっそくドキュメントみながらメモ。
Installing NDK
==========
1. http://developer.android.com/sdk/ndk/index.htmlからAndroid NDKをダウンロード
2. Android SDK最新版がインストールされていることを確認。
もし必要であれば最新版へとUPGRADE。
(NDKか過去バージョンと互換性はあるものの、過去バージョンのツールでは無いため)
http://developer.android.com/sdk/ndk/overview.html#reqs
も見といてね!
3. 1. でダウンロードしたものを、自分の環境の解凍ツールを使って解凍する。
ex) linux、tar.bz2の場合
$ tar xvjf android-ndk-r7c-linux-x86.tar.bz2
4. 解凍が終わると、「android-ndk-
」というフォルダができるので、必要があればリネームor移動。
5. 完了ー
Getting Started
===========
概ねの流れ
-----------
1. native codeで書かれたソースを
/jni/以下に設置。まぁ、JNI。
2. NDK Buildシステム用に
/jni/Android.mkを作る
3. 必要があれば
/jni/Application.mkも作る
4.
ディレクトリ直下でndk-buildスクリプトを起動しBuildする。
5. stripped shared librariesをprojectルートにコピー。
6. いつもの手段で.apk作成。
おしまい。
Creating Android.mk
--------------------
Android.mkファイルはちょっとしたbuildスクリプト。
書き方の詳細は
/docs/ANDROID-MK.htmlにあり。
作成されるライブラリは
1. static library
2. shared library
のいずれか。
Shared libraryだけがapplicationパッケージにコピーまたはインストールされる。
NDKシステムはデフォルトで
/jni/Android.mkを探しにいく。
サブディレクトリにAndroid.mkファイルを作りたいなら
/jni/Android.mkに
以下のように記述すればOK。
include $(call all-subdir-makefiles)
1つのAndroid.mkにいくつものモジュールを定義することも可能だし
複数のAndroid.mkでいくつものモジュールを定義することも可能。
buildシステムはあなたのためにおおくの詳細を扱ってくれる。
例えば、ヘッダーリストや生成されたファイルの依存関係など。
それらはbuildシステムが自動的に計算してくれる。
これは、NDKがアップデートされた際、Android.mkをいじることなく
移植することができるというメリットがある。
サンプルAndroid.mk
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := hello-jni
LOCAL_SRC_FILES := hello-jni.c
include $(BUILD_SHARED_LIBRARY)
以下、それぞれの行の説明。
LOCAL_PATH := $(call my-dir)
Android.mkファイルはLOCAL_PATH変数の定義ではじめなければならない。
開発環境のツリー構造、どこにソースがあるか、を特定することに使われる。
my-dirはマクロで、NDKシステムにより提供されていて、カレントディレクトリを返す。
include $(CLEAR_VARS)
CLEAR_VARSはNDKシステムにより提供される変数。
ある特別なGNU Makefileを指していて、LOCAL_PATHを除くいくつかのLOCAL_XXXX変数をクリアする。
一つのGNU Makeによりパースされ、全変数はglobalとなる。
よってこのクリアは必須。
LOCAL_MODULE := hello-jni
必須。モジュール名。一意でなければならず、スペースを含んではいけない。
仮に、ここにfooという名前を定義すると、NDKシステムにより、libfoo.soのように
自動的にPrefixとSuffixが付加され、生成される。
ここにlibfooという名前を定義した場合にはliblibfooとはならず、libfoo.soとprefixは
自動的に付加されない。
LOCAL_SRC_FILES := hello-jni.c
モジュールに含めるC/C++のソースリストを定義。
ヘッダファイルやincludeファイル、依存関係はNDKシステムが自動的に計算する
ので、ここにはヘッダファイルやincludeファイルは含めない。
デフォルトではC++の拡張子は'.cpp'となっている。
変更したい場合にはLOCAL_CPP_EXTENSION変数を定義する。(ドットから始まる値をセット)
include $(BUILD_SHARED_LIBRARY)
BUILD_SHARED_LIBRARY変数は、'include $(CLEAR_VARS)'以降のLOCAL_XXX変数で定義した情報を集め、何をbuildするか、どのようにbuildするかを決定するGNU Makefileスクリプトを指し示す、NDKシステムより提供される変数。共有ライブラリを生成する。
静的ライブラリを生成するBUILD_STATIC_LIBRARYもあるよ!
予約されている名前
以下の名前は予約済み。
1. LOCAL_で始まる名前。
2. PRIVATE_、NDK_ 、APP_ で始まる名前(NDK内部で使用)
3. 小文字の名前(my-dirなど)
なので、もし自分で何かしら変数を定義したいなら
"MY_"プレフィックスをつけること推奨。
と、とりあえずはしょぼいものであれば、これだけで充分かな。。。
そんだけ。
.