2013-09-25 4 views
2

Я пытаюсь выяснить, как настроить один 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 также работает правильно.

ответ

0

Я так и не нашел чистого решения «сделать». Вместо этого я написал скрипт Python для сборки каждого модуля по очереди. Простой и надежный запуск каждого ndk-build в его собственном процессе.