J'essaie de comprendre comment configurer un Android.mk
pour dépendre d'un autre. Ce dernier crée une bibliothèque partagée de code natif et la première possède une bibliothèque JNI qui dépend de la bibliothèque partagée. Appelons ces shared_lib
et service
.Comment configurer Android.mk pour effectuer une compilation imbriquée
En ce moment, le Android.mk
pour service
contient du code comme ceci:
LOCAL_SRC_FILES := ../../../shared_lib/libs/armeabi/libshared_NDK.so
include $(PREBUILT_SHARED_LIBRARY)
Cela fonctionne, mais seulement si shared_lib
était déjà construit. Le bâtiment ne construit pas shared_lib
.
J'ai écrit un script shell qui construit d'abord shared_lib
puis construit service
. Mais il semble qu'il devrait être possible d'utiliser le système de construction pour faire les tâches de construction.
J'ai essayé d'utiliser $(call import-module,...)
mais je n'ai trouvé aucune syntaxe qui fonctionne. Il y a tellement de magie dans l'expansion du chemin du makefile que je ne peux jamais prédire ce qui va se passer. Par exemple, avec ce code ajouté au Android.mk pour 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)
Cela ne fonctionne pas du tout; Je suis arrivé à ce résultat d'erreur:
/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.
On dirait que import-add-path
salit les variables, ce qui provoque les fichiers source C++ à rechercher dans un mauvais endroit. Mais import-module
échoue sans cela.
Également, l'exécution ndk-build clean
dans le répertoire service
échoue avec une erreur si vous exécutez ndk-build clean
sur shared_lib
en premier. Étant donné que le fichier .so
est répertorié en tant que fichier source local, il s'agit d'une erreur pour qu'il ne soit pas présent.
ndk-build
est construit sur make
et make
a un seul espace de noms global, et tout ce que j'ai essayé de faire un Android.mk
construire une autre Android.mk
a eu des problèmes comme celui-ci. La meilleure façon semble être d'appeler explicitement ndk-build
pour obtenir une nouvelle instance de make
et donc un espace de noms distinct.
Y at-il un moyen de configurer les choses de telle sorte que ndk-build
sur service
construira d'abord shared_lib
? Points bonus si le cas ndk-build clean
décrit ci-dessus fonctionne également correctement.