AndroidNDKのimport-module
AndroidNDKでライブラリを作成していますが、困ったことが起こりました。
状況が説明しにくいのですが、ライブラリを作成するプロジェクトを「Libs」、ライブラリを使用するプロジェクトを「Use」としましょう。
「Libs」でJNIを利用して「Use」ではJavaのみ利用という場合は、「Libs」で作成したsoを「Use」のlib/{ARCH_TARGET}にコピーしておけば問題ありません。
しかし「Use」でもJNIを利用する場合、ビルドの際に削除されてしまいます。
「Use」で外部ライブラリを扱う場合は、Makefile内でインストールする定義を記載する必要があります。
今回の場合、「Libs」側のソースも実装しながら「Use」側でテストを行いたいのでimport-moduleを使用するのがいいと思いました。
import-moduleは「Use」のビルド時に、指定したモジュールディレクトリ下にあるAndroid.mkを実行して作成されたライブラリをインストールします。
ようやく理解できたので備忘録的に残しておくことにします。
まず「Libs」側のAndroid.mk、libgaibu.soを作成します。
このファイルのパスは「{Eclipseのワークスペース}/Libs/jni/Android.mk」です。このパスは非常に重要です。
Libs:Android.mk
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE = gaibu
LOCAL_SRC_FILES := gaibu.c
include $(BUILD_SHARED_LIBRARY)
Use:Android.mk
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE = use
LOCAL_SRC_FILES := use.c
LOCAL_SHARED_LIBRARIES := gaibu
include $(BUILD_SHARED_LIBRARY)
$(call import-module, Libs/jni)
実はimport-moduleの第二引数は「NDK_MODULE_PATH」という環境変数と合わせて、「Libs」側のAndroid.mkが存在するディレクトリまでのパスを指定する必要があります。
ここが大きなハマりポイントです。上記の表記の場合、NDK_MODULE_PATHは{Eclipseのワークスペース}のパスとなります。
また、importするライブラリも指定する必要があります。
”LOCAL_SHARED_LIBRARIES := gaibu”がそれにあたります。
こちらは「Libs」側で指定したLOCAL_MODULEの値となります。
「Use」側がスタティックライブラリの場合はLOCAL_STATIC_LIBRARIESに変わるので注意してください。