2013-09-25 1 views
2

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.

Répondre

0

Je n'ai jamais trouvé de solution «make» pure. Au lieu de cela, j'ai écrit un script Python pour construire chaque module à son tour. Il est simple et robuste d'exécuter chaque ndk-build dans son propre processus.

Questions connexes