2

Android.mkあるものを別のものに依存するように設定する方法を理解しようとしています。後者はネイティブ コード共有ライブラリを構築し、前者は共有ライブラリに依存する JNI ライブラリを持っています。shared_libこれらを と と呼びましょうservice

現在、Android.mkforには次の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 cleanshared_lib.so

ndk-buildの上に構築され、単一のグローバル名前空間を持ち、あるビルドを別のビルドにするために試みたすべてのものには、makeこのような問題がありました。最良の方法は、明示的に呼び出して新しいインスタンスを取得し、したがって別の名前空間を取得することです。makeAndroid.mkAndroid.mkndk-buildmake

ndk-buildonが最初serviceにビルドされるように設定する方法はありますか? 上記shared_libの場合も正常に動作する場合はボーナス ポイント。ndk-build clean

4

1 に答える 1

0

純粋な「make」ソリューションは見つかりませんでした。代わりに、各モジュールを順番にビルドする Python スクリプトを作成しました。ndk-buildそれぞれを独自のプロセスで実行するのは簡単で堅牢です。

于 2014-04-19T05:03:20.970 に答える