2011/03/21

Android.mk.htmlを勝手に解釈

Android.mkファイルの作り方がよくわからなかったので、
NDKのDocフォルダにあるANDROID.MK.HTMLファイルを読んでみました。

ついでなので、前半を翻訳したものを記事として載せておきます。
変数一覧については、kwlogさんのところが見やすいです。


Android.mk.html  (android ndk r5bより)

はじめに
-------------
このドキュメントは、CまたはC++でかかれたコードをAndroid.mkファイルを通じて
ビルドする方法を説明します。以下の項目を理解するために、あらかじめdocs/OVERVIEW.HTMLに
目を通しておくことをオススメします。

概要
---------
Android.mkファイルは、あなたのソースファイルをビルドシステムに説明するために
仕様されます。具体的に言うと、
- このファイルは、GNU Makefileのごく一部となります。ビルドシステムにより、このファイルは
  1回もしくは複数回解釈されます。そのため、Androkd.mkファイルに宣言する変数の数を
  最小限に抑えるよう努めてください。また、ある変数が解釈中に定義されていないことは想定しないでください。


- ファイル構文は、あなたのソースファイルを共有ライブラリまたは静的ライブラリとしてグループ化できるように設計されています。
  共有ライブラリのみが、あなたのアプリケーションパッケージにインストール(またはコピー)されます。
  静的ライブラリは、共有ライブラリを生成するために使用することができます。
  また、1つのAndroid.mkファイルに複数のモジュールを定義することも、複数のモジュールを複数のAndroid.mkファイルに定義することもできます。

- ビルドシステムはあなたのために色々な作業を行います。たとえば、あなたはAndroid.mkファイルにヘッダファイルや
  依存関係を記載する必要はありません。NDKビルドシステムは、自動的にこれらを計算します。
  これは、あなたが新しいバージョンのNDKにアップデートするときも、Android.mkファイルに手を加えなくとも
  新しいプラットフォームの恩恵を受けることが出来ることも意味します。


例:
---------------
構文の細かいところを説明する前に、簡単な例として"hello JNI"プロジェクトについて考えてみます。
このプロジェクトは、下記ディレクトリにあります。
    apps/hello-jni/project

このディレクトリにあるフォルダを見てみると、
- 'src'ディレクトリはAndroidプロジェクトのためのJavaのソースファイルが含まれています。
- 'jni'ディレクトリには、ネイティブのソースコードが含まれています。(今回は'jni/hello-jni.c')
    このソースファイルは、VMアプリケーションに文字列を返す関数を実装した、共有ライブラリのソースコードです。

- 'jni/Android.mk'ファイルは、このソースから共有ライブラリを作成するようにNDKビルドシステムに通知しています。
このファイルの中身は、下記のようになっています。

   --------------- 切り取り線 ------------------
   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'は
ビルドシステムから提供され、Android.mkファイルがあるディレクトリを返します。


  include $(CLEAR_VARS)

CLEAR_VARSは、LOCAL_PATH以外のLOCALで始まるMakefileの各種変数
(LOCAL_MODULE, LOCAL_SRC_FILES, LOCAL_STATIC_LIBRARIES, などなど)をクリアします。

  LOCAL_MODULE := hello-jni

LOCAL_MODULEは、それぞれのモジュールを一意に識別するために必要なものです。
また、LOCAL_MODULEの名前は重複してはならず、スペースも含めてはいけません。
ビルドシステムは、自動的にライブラリのプレフィックスとサフィックスを追加するので、
名称にlibなどをつける必要はありません。
例:fooという名前が指定され、共有ライブラリを作成する場合は、libfoo.soというファイル名で出力されます。

[重要]
もし、モジュール名を'libfoo'とした場合、ビルドシステムは'lib'をプレフィックスとして追加することはありません。つまり、生成されるファイルはlibfoo.soとなります。


  LOCAL_SRC_FILES := hello-jni.c

LOCAL_SRC_FILESは、cまたはc++のソースファイルのリストでなければなりません。
ここには、ヘッダファイルやインクルードファイルを記載する必要はありません。
ビルドシステムが、必要なファイルをを自動的に計算するためです。

C++のソースファイルの拡張子は'.cpp'であることに注意してください。
ただ、LOCAL_CPP_EXTENSIONで指定することで拡張子を指定することもできます。
(注意:拡張子の前のドットを忘れないでください。)


  include $(BUILD_SHARED_LIBRARY)

BUILD_SHARED_LIBRARYはNDKビルドシステムから提供される変数で、
最後に実行された'include $(CLEAR_VARS)'以降に指定された、LOCAL_XXX変数を元に、
必要なファイルなどをビルドするために集めるスクリプトを指します。
静的ライブラリを作成する場合は、BUILD_STATIC_LIBRARYを使用します。

以後、各種変数の説明なので省略しました。

ではまた。

0 件のコメント:

コメントを投稿