androidプラットフォームのjni(二)を深く理解する

7243 ワード

Android.mkはAndroidが提供するmakefileファイルで、コンパイル生成soライブラリ名、参照ヘッダファイルディレクトリ、コンパイルが必要なものなどを指定する.c/.cppファイルと.a静的ライブラリファイルなど.jniをマスターするにはAndroidをマスターしなければなりません.mkの文法規範.
一、Android.mkファイルの用途
1つのandroidサブプロジェクトに1つ以上のAndroidが存在します.mkファイル
1、単一のAndroid.mkファイル
NDKのsampleディレクトリの下にあるhello-jniプロジェクトを直接参照すると、このプロジェクトにはAndroidが1つしかありません.mkファイル
2、複数のAndroid.mkファイル
コンパイルが必要なモジュールが多い場合は、対応するモジュールを対応するディレクトリに配置する可能性があります.
これにより、各ディレクトリで対応するAndroidを定義できます.mkファイル(上記のような書き方)、
最後に、ルートディレクトリにAndroidを配置します.mkファイル、内容は以下の通りです.
include $(call all-subdir-makefiles)
この行だけでいいです.その役割はすべてのサブディレクトリのAndroidを含むことです.mkファイル
3、複数のモジュールが一つのAndroidを共用する.mk
このファイルでは、ソースファイルをモジュールにまとめることができます.このモジュールには、次のものが含まれています.
-静的ライブラリ(.aファイル)
-ダイナミックライブラリ(.soファイル)
アプリケーションソフトウェア(APK)パッケージにインストール/コピーできるのは、共有ライブラリのみです.
include$(BUILD_STATIC_LIBRARY)、コンパイルされたのは静的ライブラリ
include$(BUILD_SHARED_LIBRARY)、コンパイルされたダイナミックライブラリ
二、カスタム変数
以下はAndroid.mkで依存または定義された変数のリストで、他の変数を自分で使用するように定義できますが、NDKコンパイルシステムは次の変数名を保持します.
-LOCALで冒頭の名前(LOCAL_MODULEなど)
-PRIVATE_で、NDK_ またはAPP_先頭の名前(内部使用)
-小文字(内部使用、例えば「my-dir」)
便宜のためならAndroidでmkでは独自の変数を定義し、MY_を使用することを推奨します.接頭辞、小さな例:
MY_SOURCES := foo.c
ifneq ($(MY_CONFIG_BAR),)
MY_SOURCES += bar.c
endif
LOCAL_SRC_FILES += $(MY_SOURCES)
注意:':='は値を付ける意味です;'+='追加する変数を参照する値を表します.
三、GNU Makeシステム変数
これらのGNU Make変数はあなたのAndroidにあります.mkファイルを解析する前に、コンパイルシステムによって定義されています.場合によってはNDKがAndroidを分析する可能性があることに注意してください.mkは数回、ある変数の定義が毎回異なる.
(1)CLEAR_VARS:定義されていないLOCAL_XXX変数のほとんどが「Module-description」セクションにリストされているコンパイルスクリプトを指します.このスクリプトは、新しいモジュールを開始する前にinclude$(CLEAR_VARS)を含めて、LOCAL_VARSをリセットする必要があります.PATH変数以外のすべてのLOCAL_XXXシリーズ変数.
(2)BUILD_SHARED_LIBRARY:コンパイルスクリプトを指し、すべてのLOCAL_XXX変数に基づいてリストされたソースファイルを1つの共有ライブラリにコンパイルする.
このファイルを含める前に少なくともLOCAL_を定義する必要があります.MODULEとLOCAL_SRC_FILES.
(3)BUILD_STATIC_LIBRARY:1つのBUILD_SHARED_LIBRARY変数は、1つの静的ライブラリをコンパイルするために使用されます.静的ライブラリは、APKパッケージにコピーされませんが、共有ライブラリのコンパイルに使用できます.
例:include$(BUILD_STATIC_LIBRARY)
なお、lib$(LOCAL_MODULE)という名前が生成する.aのファイル
(4)TARGET_ARCH:ターゲットCPUプラットフォームの名前
(5)TARGET_PLATFORM:Android.mk解析の場合、ターゲットAndroidプラットフォームの名前.詳細は/development/ndk/docs/stable-apis.txt.
       android-3 -> Official Android 1.5 system images
       android-4 -> Official Android 1.6 system images
       android-5 -> Official Android 2.0 system images
(6)TARGET_ARCH_ABI:一時的に2つのvalue,armeabi,armeabi-v 7 aしかサポートされていない.
(7)TARGET_ABI:ターゲットプラットフォームとABIの組み合わせ、
                              
四、モジュール記述変数
次の変数は、コンパイルシステムにモジュールを説明するために使用されます.'include$(CLEAR_VARS)'と'include$(BUILD_XXXXX)'の間で定義する必要があります.$(CLEAR_VARS)は、これらの変数をすべてクリアするスクリプトです.
(1)LOCAL_PATH:この変数は、現在のファイルのパスを与えるために使用される.
Androidでmkの先頭定義:LOCAL_PATH := $(call my-dir)
現在のディレクトリの下にフォルダ名srcがある場合は、$(call src)と書くと、srcディレクトリの完全なパスが得られます.
この変数は$(CLEAR_VARS)でクリアされないので、Androidごとにmkは、1つのファイルでいくつかのモジュールが定義されている場合でも、一度だけ定義する必要があります.
(2)LOCAL_MODULE:これはモジュールの名前で、一意でなければならず、スペースを含めることはできません.
任意の$(BUILD_XXXX)スクリプトを含む前に定義する必要があります.モジュールの名前は生成ファイルの名前を決定します.
(3)LOCAL_SRC_FILES:コンパイルするソースファイルのリストです.
コンパイルシステムが自動的に計算に依存するため、コンパイラに渡すファイルをリストします.注ソースファイル名はすべてLOCAL_に対してPATHの場合、パスセクションを使用できます.たとえば、次のようにします.
        LOCAL_SRC_FILES := foo.c toto/bar.c\
        Hello.c
ファイル間はスペースまたはTabキーで分割できます.改行は「」で行います.
追加ソースファイルならLOCAL_SRC_FILES +=
注意:LOCAL_SRC_FILES:=$(call all-subdir-java-files)この形式でlocal_を含むpathディレクトリの下にあるすべてのjavaファイル.
(4)LOCAL_C_INCLUDES:ヘッダファイルの検索パスを示すオプション変数.
デフォルトのヘッダファイルの検索パスはLOCAL_です.PATHディレクトリ.
(5)LOCAL_STATIC_LIBRARIES:コンパイル時にリンクするためにモジュールが使用する静的ライブラリを示します.
(6)LOCAL_SHARED_LIBRARIES:モジュールが実行時に依存する共有ライブラリ(ダイナミックライブラリ)を表し、ファイル生成時に対応する情報を埋め込むためにリンク時に必要となる.
注:リストされたモジュールはコンパイル図に添付されません.つまり、Applicationが必要です.mkでは、プログラムが要求するモジュールに追加します.
(7)LOCAL_LDLIBS:モジュールをコンパイルする際に使用する追加のリンクオプション.指定したライブラリの名前を「-l」接頭辞で渡すのに役立ちます.
例えば、LOCAL_LDLIBS:=-lzは、リンク生成モジュールがロード時点で/system/lib/libzにリンクすることを示す.so
docs/STABLE-APISを表示できます.TXTは、NDKリリースを使用してリンクできるオープンシステムライブラリのリストを取得します.
   (8)LOCAL_MODULE_PATHとLOCAL_UNSTRIPPED_PATH
Android.mkファイルでは、LOCAL_を使用することもできます.MODULE_PATHとLOCAL_UNSTRIPPED_PATHは最後のターゲットインストール経路を指定する.
異なるファイルシステムパスは、次のマクロで選択します.
       TARGET_ROOT_OUT:ルートファイルシステムを表します.
       TARGET_OUT:システムファイルシステムを表します.
       TARGET_OUT_DATA:dataファイルシステムを表します.
使い方:LOCAL_MODULE_PATH :=$(TARGET_ROOT_OUT)
LOCAL_についてはMODULE_PATHとLOCAL_UNSTRIPPED_PATHの違いは、まだ分かりません.
(9)LOCAL_JNI_SHARED_LIBRARIES:含めるsoライブラリファイルの名前を定義し、プログラムがjniを採用していない場合は不要
        LOCAL_JNI_SHARED_LIBRARIES:=libxxxこのようにコンパイルする時、NDKは自動的にこのlibxxxをapkにパッケージします;youapk/lib/ディレクトリの下に置く
五、NDK提供の関数マクロ
GNU Make関数マクロは、'$(call)'を使用して呼び出される必要があります.戻り値はテキスト化された情報です.
(1)my-dir:現在のAndroid.mkが存在するディレクトリのパスを返し、NDKコンパイルシステムの最上位レベルに対して返します.これは、Android.mkファイルの先頭でこのように定義するのに役立ちます.
        LOCAL_PATH := $(call my-dir)
(2)all-subdir-makefiles:現在の'my-dir'パスのサブディレクトリにあるすべてのAndroid.mkのリストを返します.
たとえば、サブプロジェクトのディレクトリ階層は次のようになります.
            src/foo/Android.mk
            src/foo/lib1/Android.mk
            src/foo/lib2/Android.mk
もしsrc/foo/Android.mkには次の行が含まれます.
           include $(call all-subdir-makefiles)
src/foo/lib 1/Androidが自動的に含まれますmkとsrc/foo/lib 2/Android.mk.
この機能は、コンパイルシステムに深いネストされたコードディレクトリ階層を提供するために使用されます.
なお、デフォルトでは、NDKはsrc/*/ANdroidのみを検索する.mkのファイル.
(3)this-makefile:現在のMakefileのパスを返す(この関数が呼び出された場所)
(4)parent-makefile:呼び出しツリーの親Makefileパスを返します.現在のMakefileを含むMakefileパスです.
(5)grand-parent-makefile:呼び出しツリーの親Makefileの親Makefileのパスを返す
六、Android.mk例
#     
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE = libhellos
LOCAL_CFLAGS = $(L_CFLAGS)
LOCAL_SRC_FILES = hellos.c
LOCAL_C_INCLUDES = $(INCLUDES)
LOCAL_SHARED_LIBRARIES := libcutils
LOCAL_COPY_HEADERS_TO := libhellos
LOCAL_COPY_HEADERS := hellos.h
include $(BUILD_STATIC_LIBRARY)

#     
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE = libhellod
LOCAL_CFLAGS = $(L_CFLAGS)
LOCAL_SRC_FILES = hellod.c
LOCAL_C_INCLUDES = $(INCLUDES)
LOCAL_SHARED_LIBRARIES := libcutils
LOCAL_COPY_HEADERS_TO := libhellod
LOCAL_COPY_HEADERS := hellod.h
include $(BUILD_SHARED_LIBRARY)

#     
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := hellos
LOCAL_STATIC_LIBRARIES := libhellos
LOCAL_SHARED_LIBRARIES :=
LOCAL_LDLIBS += -ldl
LOCAL_CFLAGS := $(L_CFLAGS)
LOCAL_SRC_FILES := mains.c
LOCAL_C_INCLUDES := $(INCLUDES)
include $(BUILD_EXECUTABLE)

#     
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := hellod
LOCAL_MODULE_TAGS := debug
LOCAL_SHARED_LIBRARIES := libc libcutils libhellod
LOCAL_LDLIBS += -ldl
LOCAL_CFLAGS := $(L_CFLAGS)
LOCAL_SRC_FILES := maind.c
LOCAL_C_INCLUDES := $(INCLUDES)
include $(BUILD_EXECUTABLE)

本文は転載を歓迎して、転載して作者と出典を明記してください
作者:流星
出典:http://blog.sina.com.cn/staratsky