メモ代わり。てきとーに。 いや、ですからてきとーですって。 2年前ぐらいにPythonあたりでメールくれた方、ごめんなさい。メール紛失してしまい無視した形になってしまいました。。。

2012年4月16日月曜日

[Android][お勉強] NDK環境構築とGetting Started

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_"プレフィックスをつけること推奨。


と、とりあえずはしょぼいものであれば、これだけで充分かな。。。

そんだけ。
.

0 コメント: