ビルド済みライブラリの使用

NDK は、ビルド済み静的ライブラリとビルド済み共有ライブラリの両方をサポートします。この機能には、2 つの主要なユースケースがあります。

  • ソースを配布せずに、独自のライブラリをサードパーティの NDK デベロッパーに配布する。
  • ビルド済みバージョンの独自のライブラリを使用して、ビルドに要する時間を短縮する。

このページでは、ビルド済みライブラリを使用する方法について説明します。

ビルド済みライブラリを宣言する

使用する各ビルド済みライブラリを単一の独立したモジュールとして宣言する必要があります。そのためには次の手順を実施します。

  1. モジュールに名前を付けます。この名前は、ビルド済みライブラリの名前と同じにする必要はありません。
  2. モジュールの Android.mk ファイルで、提供しているビルド済みライブラリへのパスを LOCAL_SRC_FILES に割り当てます。LOCAL_PATH 変数の値に対する相対パスを指定します。

    注: ターゲット ABI に適したバージョンのビルド済みライブラリを選択する必要があります。ABI に対するライブラリ サポートの保証については、ビルド済みライブラリの ABI を選択するで詳細をご覧ください。

  3. 共有(.so)ライブラリと静的(.a)ライブラリのどちらを使用しているかに応じて、PREBUILT_SHARED_LIBRARY または PREBUILT_STATIC_LIBRARY を含めます。

ビルド済みライブラリ libfoo.so がそのライブラリを記述した Android.mk ファイルと同じディレクトリにある場合の簡単な例を次に示します。

    LOCAL_PATH := $(call my-dir)

    include $(CLEAR_VARS)
    LOCAL_MODULE := foo-prebuilt
    LOCAL_SRC_FILES := libfoo.so
    include $(PREBUILT_SHARED_LIBRARY)
    

この例では、モジュールの名前がビルド済みライブラリの名前と同じです。

ビルドシステムはビルド済み共有ライブラリのコピーを $PROJECT/obj/local に配置し、デバッグ情報を取り除いた別のコピーを $PROJECT/libs/<abi> に配置します。ここで、$PROJECT はプロジェクトのルート ディレクトリです。

他のモジュールからビルド済みライブラリを参照する

他のモジュールからビルド済みライブラリを参照するには、それらのモジュールに関連付けられている Android.mk ファイル内の LOCAL_STATIC_LIBRARIES または LOCAL_SHARED_LIBRARIES 変数の値に、ビルド済みライブラリの名前を指定します。

たとえば、libfoo.so を使用するモジュールの場合、次のように指定します。

    include $(CLEAR_VARS)
    LOCAL_MODULE := foo-user
    LOCAL_SRC_FILES := foo-user.c
    LOCAL_SHARED_LIBRARIES := foo-prebuilt
    include $(BUILD_SHARED_LIBRARY)
    

ここで、LOCAL_MODULE はビルド済みライブラリを参照するモジュールの名前で、LOCAL_SHARED_LIBRARIES はビルド済みライブラリ自体の名前です。

ビルド済みライブラリのヘッダーをエクスポートする

ビルド済みライブラリとともに配布される foo.h などのヘッダー ファイルに通常存在する特定の宣言に応じて、foo-user.c のコードは変わります。たとえば、foo-user.c には、次のような行が含まれる場合があります。

    #include <foo.h>
    

このような場合は、foo-user モジュールをビルドするときに、コンパイラにヘッダーとそのインクルード パスを提供する必要があります。このタスクを簡単に完了するには、ビルド済みモジュールの定義でエクスポートを使用します。たとえば、ビルド済みモジュールに関連付けられている include ディレクトリの下にヘッダー foo.h がある場合、次のように宣言できます。

    include $(CLEAR_VARS)
    LOCAL_MODULE := foo-prebuilt
    LOCAL_SRC_FILES := libfoo.so
    LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/include
    include $(PREBUILT_SHARED_LIBRARY)
    

ここで、LOCAL_EXPORT_C_INCLUDES 宣言により、ビルドシステムがパスをビルド済みライブラリの include ディレクトリにエクスポートし、そのパスに依存しているモジュールの LOCAL_C_INCLUDES の値にそのパスを付加できるようになります。

この操作により、ビルドシステムが必要なヘッダーを見つけられるようになります。

ビルド済みライブラリをデバッグする

デバッグ シンボルを含んだビルド済み共有ライブラリを使用することをおすすめします。NDK ビルドシステムでは、$PROJECT/libs/<abi>/ にインストールするバージョンのライブラリからシンボルが常に削除されますが、デバッグ バージョンのライブラリを使用すると ndk-gdb でデバッグできます。

ビルド済みライブラリの ABI を選択する

ターゲット ABI 向けに適切なバージョンのビルド済み共有ライブラリを選択する必要があります。TARGET_ARCH_ABI 変数は Android.mk ファイルにあり、この変数は適切なバージョンのライブラリをビルドシステムに示します。

たとえば、プロジェクトに以下の 2 つのバージョンのライブラリ libfoo.so が含まれているとします。

    armeabi/libfoo.so
    x86/libfoo.so
    

次のスニペットは、ビルドシステムが適切なバージョンのライブラリを選択するように TARGET_ARCH_ABI を使用する方法を示しています。

    include $(CLEAR_VARS)
    LOCAL_MODULE := foo-prebuilt
    LOCAL_SRC_FILES := $(TARGET_ARCH_ABI)/libfoo.so
    LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/include
    include $(PREBUILT_SHARED_LIBRARY)
    

TARGET_ARCH_ABI の値として armeabi を指定した場合、ビルドシステムは armeabi ディレクトリにあるバージョンの libfoo.so を使用します。TARGET_ARCH_ABI の値として x86 を指定した場合、ビルドシステムは x86 ディレクトリにあるバージョンを使用します。