Я пытаюсь выяснить, как настроить один Android.mk
, чтобы зависеть от другого. Последний создает коллективную библиотеку с собственным кодом, а первая имеет библиотеку JNI, которая зависит от общей библиотеки. Назовем их shared_lib
и service
.Как настроить Android.mk для выполнения вложенной сборки
Прямо сейчас, Android.mk
для 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,...)
, но не нашел синтаксиса, который работает. В расширении пути makefile так много волшебства, что я никогда не могу предсказать, что произойдет. Например, этот код добавляется в 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
на service
построит shared_lib
? Бонусные баллы, если описанный выше случай ndk-build clean
также работает правильно.