Android.mk
あるものを別のものに依存するように設定する方法を理解しようとしています。後者はネイティブ コード共有ライブラリを構築し、前者は共有ライブラリに依存する JNI ライブラリを持っています。shared_lib
これらを と と呼びましょうservice
。
現在、Android.mk
forには次のservice
ようなコードが含まれています。
LOCAL_SRC_FILES := ../../../shared_lib/libs/armeabi/libshared_NDK.so
include $(PREBUILT_SHARED_LIBRARY)
shared_lib
これは機能しますが、既にビルドされている場合のみです。建物service
は建てませんshared_lib
。
shared_lib
最初にビルドしてからビルドするシェルスクリプトを書きましたservice
。しかし、ビルド システムを使用してビルド タスクを実行することは可能であるように思われます。
使用しようとし$(call import-module,...)
ましたが、機能する構文が見つかりませんでした。メイクファイルのパス展開には非常に多くの魔法がかかっているため、何が起こるか予測できません。たとえば、次のコードを Android.mk に追加すると、次のようになりservice
ます。
include $(CLEAR_VARS)
SL_DIR=$(LOCAL_PATH)/../../../shared_lib
$(call import-add-path,$(SL_DIR))
NDK_MODULE_PATH := $(SL_DIR)
$(call import-module, jni)
これはまったく機能しませんでした。私はこのエラー結果を得ました:
/Users/steveha/devel/android/ndk/build/core/build-binary.mk:450: warning: overriding commands for target `obj/local/armeabi/libshared_NDK.so'
/Users/steveha/devel/android/ndk/build/core/build-binary.mk:473: warning: ignoring old commands for target `obj/local/armeabi/libshared_NDK.so'
/Users/steveha/devel/android/ndk/build/core/build-binary.mk:489: warning: overriding commands for target `libs/armeabi/libshared_NDK.so'
/Users/steveha/devel/android/ndk/build/core/build-binary.mk:489: warning: ignoring old commands for target `libs/armeabi/libshared_NDK.so'
make: *** No rule to make target `../../shared_library/jni/com_dts_SourceFile.cpp', needed by `obj/local/armeabi/objs/dts-shared-jni/com_dts_shared_SourceFile.o'. Stop.
import-add-path
変数を台無しにして、C++ ソース ファイルが間違った場所で検索される原因になっているようです。しかしimport-module
、それなしでは失敗します。
また、ndk-build clean
のディレクトリで実行すると、最初に実行するとエラーで失敗service
します。ファイルはローカル ソース ファイルとしてリストされているため、存在しない場合はエラーになります。ndk-build clean
shared_lib
.so
ndk-build
の上に構築され、単一のグローバル名前空間を持ち、あるビルドを別のビルドにするために試みたすべてのものには、make
このような問題がありました。最良の方法は、明示的に呼び出して新しいインスタンスを取得し、したがって別の名前空間を取得することです。make
Android.mk
Android.mk
ndk-build
make
ndk-build
onが最初service
にビルドされるように設定する方法はありますか? 上記shared_lib
の場合も正常に動作する場合はボーナス ポイント。ndk-build clean