ビルド済みライブラリを使用する

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

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

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

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

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

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

  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-user.c のコードは具体的な宣言に応じて異なります。宣言は通常、ビルド済みライブラリとともに配布される foo.h などのヘッダー ファイルの中にあります。たとえば、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 ディレクトリにあるバージョンを使用します。