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

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 向けに適切なバージョンのビルド済み共有ライブラリを選択する必要があります。 Android.mk ファイルの TARGET_ARCH_ABI 変数は、適切なバージョンのライブラリをビルドシステムに示します。

たとえば、プロジェクトに以下の 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 ディレクトリにあるバージョンを使用します。