N2-Works
WEB企画・制作/システム開発 大阪拠点

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に変わるので注意してください。

[Android]2012年12月07日 18時25分03秒

※1000文字以内で入力してください

captcha
TOP