web-dev-qa-db-fra.com

Android NDK: comment inclure Android.mk dans un autre Android.mk (structure de projet hiérarchique)?

On dirait que c'est possible, mais mon script produit des résultats étranges:

LOCAL_PATH:= $(call my-dir)
include $(CLEAR_VARS)

include $(LOCAL_PATH)/libos/Android.mk
include $(LOCAL_PATH)/libbase/Android.mk
include $(LOCAL_PATH)/utils/Android.mk

LOCAL_MODULE := native
include $(BUILD_SHARED_LIBRARY)

Seule la première inclusion est analysée, d’autres fichiers Android.mk sont en voie d’être égarés . Suggestions?

Mise à jour: J'ai cassé l'environnement de mon bâtiment ... C'était correct dans le bureau, mais à la maison LOCAL_PATH: = $ (call my-dir) définit LOCAL_PATH en dir NDK au lieu de dir du projet. Ceci est mon lot pour la construction: 

set BASHPATH=K:\cygwin\bin\bash
set PROJECTDIR=/cygdrive/h/Alex/Alex/Work/Android/remote-Android
set NDKDIR=/cygdrive/h/Alex/Programming_Docs/Android/android-ndk-r6/ndk-build
set APP_BUILD_SCRIPT=/cygdrive/h/Alex/Alex/Work/Android/project/jni/Android.mk
set DEV_ROOT=h:/Alex/Alex/Work/Android/project

%BASHPATH% --login -c "cd %PROJECTDIR% && %NDKDIR%"

Mise à jour: Je ne comprends absolument pas comment cette chose compose les chemins. Je reçois des erreurs avec des chemins tels que "/cygdrive/d/project/jni//cygdrive/d/Soft/project/jni/libos/src/libos.cpp '. C'est après avoir décidé de spécifier tous les fichiers de la racine. Android.mk au lieu d'inclure des sous-modules.

Mise à jour 2: Pas de chance, cela ne fonctionne pas non plus:

LOCAL_PATH:= $(call my-dir)
# Include makefiles here.
include $(LOCAL_PATH)/libos/Android.mk
include $(LOCAL_PATH)/libbase/Android.mk
include $(LOCAL_PATH)/utils/Android.mk

# Clear variables here.
 include $(CLEAR_VARS)
20
Violet Giraffe

Assez tard ici, mais au cas où quelqu'un lirait cette question, un moyen de contourner le problème des chemins cassés (pointant vers le ndk de vos fichiers depuis le jni) est d'avoir dans votre dossier jni:

include $(call all-subdir-makefiles)

et ensuite dans chaque sous-dossier de celui-ci (libos, libbase et ustils dans le cas de OP) un Android.mk de cette forme:

LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_C_INCLUDES        := $(LOCAL_PATH)
LOCAL_MODULE            := utils
LOCAL_SRC_FILES         := one.c
LOCAL_SRC_FILES         += two.c

où ce deuxième Android.mk avec les fichiers one.c et two.c dans un sous-dossier se trouvant dans le dossier jni.

Notez que d'essayer quelque chose comme

LOCAL_PATH_BIS_WEIRD_OTHER_NAME := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_C_INCLUDES        := $(LOCAL_PATH_OTHER_FUNKY_NAME)
LOCAL_MODULE            := utils
LOCAL_SRC_FILES         := one.c
LOCAL_SRC_FILES         += two.c

conduira à nouveau à un compilateur confus recherchant votre code source où se trouve le ndk. 

Donc, utilisez le LOCAL_PATH: = $ (call my-dir) EXACTEMENT sous cette forme dans chaque sous-répertoire du jni et include $ (appelez all-subdir-makefiles) dans le jni lui-même pas de problèmes. 

J'espère que cela aidera quelqu'un.

Edit: ce problème se produit car ce qui est conservé dans LOCAL_PATH n'est pas supprimé par include $ (CLEAR_VARS).

21
Mona Paun

Voici comment je le fais. 

Un inconvénient est que je ne mets aucun de mes codes sources C++ dans le répertoire de construction, car la plupart d'entre eux sont indépendants de la plate-forme. Cela signifie simplement que LOCAL_PATH n'est pas un sous-répertoire du répertoire du projet et que les seuls fichiers de/jni sont les 2 fichiers .mk. 

Quoi qu'il en soit, voici un fichier Android.mk de niveau supérieur complet et l'un des logiciels inclus pour un projet réel:

Haut niveau:

LOCAL_PATH := $(abspath $(call my-dir)/../../../src)

# utility to create paths for included makefiles
local-rel-path = $(patsubst /%,%,$(subst $(LOCAL_PATH),,$(abspath $1)))

include $(CLEAR_VARS)

LOCAL_MODULE := NativeApp

LOCAL_LDLIBS := -lGLESv1_CM

# As opposed to "thumb"
LOCAL_ARM_MODE := arm

LOCAL_SRC_FILES :=

#
# includes
#
# Note that LOCAL_C_INCLUDE is relative to thr NDK root, unlike source paths
# (or you can just make 'em absolute)
#
STL_INC_DIR = /cygdrive/c/STLport-5.2.1/stlport

MY_LOCAL_C_INCLUDES := core satcalc bruce/bruce/inc bruce/gfx/inc bruce/ui/inc bruce/unzip bruce/libpng

LOCAL_C_INCLUDES := $(addprefix $(LOCAL_PATH)/,$(MY_LOCAL_C_INCLUDES)) $(STL_INC_DIR) 

ifeq ($(APP_OPTIM),debug)
# debug
LOCAL_CFLAGS = -DPLATFORM_Android -D_DEBUG -fvisibility=hidden
else
#release
LOCAL_CFLAGS = -DPLATFORM_Android -fvisibility=hidden
endif

LOCAL_STATIC_LIBRARIES := 

#
# Code
#
include $(LOCAL_PATH)/core/Android.mk
include $(LOCAL_PATH)/satcalc/Android.mk
include $(LOCAL_PATH)/bruce/bruce/src/Android.mk
include $(LOCAL_PATH)/bruce/gfx/src/Android.mk
include $(LOCAL_PATH)/bruce/ui/src/Android.mk
include $(LOCAL_PATH)/bruce/unzip/Android.mk
include $(LOCAL_PATH)/bruce/libpng/Android.mk

#
# Build it
#
include $(BUILD_SHARED_LIBRARY)

... et un Android.mk inclus:

MY_PATH = $(call my-dir)

MY_LOCAL = $(call local-rel-path, $(MY_PATH))

MY_SRC_FILES = Font.cpp Gfx2d_ogles.cpp SgaState.cpp \
        Sprite.cpp TImage.cpp TImageOgles.cpp 

LOCAL_SRC_FILES += $(addprefix $(MY_LOCAL)/,$(MY_SRC_FILES))
14
jimkberry

Mon approche est comme ça:

LOCAL_PATH:= $(call my-dir)

# Clear variables here.
include $(CLEAR_VARS)

# Current module settings.
LOCAL_MODULE := native
# setup some source files
LOCAL_SRC_FILES := file1.c file2.c
# setup some includes
LOCAL_C_INCLUDES := $(LOCAL_PATH)/libos/include
# setup the included libs for the main module
LOCAL_STATIC_LIBRARIES := libos libbase utils # note that order matters here

include $(BUILD_SHARED_LIBRARY)

# Include makefiles here. Its important that these 
# includes are done after the main module, explanation below.

# create a temp variable with the current path, because it 
# changes after each include
ZPATH := $(LOCAL_PATH)

include $(ZPATH)/libos/Android.mk
include $(ZPATH)/libbase/Android.mk
include $(ZPATH)/utils/Android.mk

Notez que cela inclut sont faits après la configuration des variables du module actuel. Cela est nécessaire car chaque inclusion modifie la variable LOCAL_PATH (en réalité, elle modifie ce que $ (call my-dir) renvoie) et c’est la raison pour laquelle les inclusions doivent être faites en dernier.

Cela va automatiquement compiler tous les modules inclus (ou nettoyer ensuite si appelé avec clean) et ensuite lier avec toutes les bibliothèques incluses.

Cette configuration a été testée dans un projet réel et fonctionne correctement.

réponse tirée d'ici: https://docs.google.com/document/d/1jDmWgVgorTY_njX68juH5vt0KY_FXWgxkxmi2v_W_a4/edit

10
user2021201

Vous êtes sur la bonne voie. C’est la bonne façon d’inclure des fichiers Android.mk dans un autre. C’est en fait requis par le système de création Android. Une chose à noter est que la ligne pour effacer les variables devrait apparaître -après-vous incluez les autres makefiles, comme ceci:

LOCAL_PATH:= $(call my-dir)

# Include makefiles here.
include $(LOCAL_PATH)/libos/Android.mk
include $(LOCAL_PATH)/libbase/Android.mk
include $(LOCAL_PATH)/utils/Android.mk

# Clear variables here.
include $(CLEAR_VARS)

# Final settings.
LOCAL_MODULE := native
include $(BUILD_SHARED_LIBRARY)

Je voudrais également mentionner qu'il y a d'autres drapeaux importants que vous pouvez ou ne pas vouloir définir, notamment le suivant (un exemple de l'un de mes fichiers makefiles):

# Settings.
LOCAL_C_INCLUDES             := $(MY_INCLUDES)
LOCAL_STATIC_LIBRARIES       := $(MY_MODULES) 
LOCAL_WHOLE_STATIC_LIBRARIES := $(MY_WHOLE_MODULES) 
LOCAL_LDLIBS                 := -lz -llog -lGLESv1_CM -lGLESv2 
LOCAL_ARM_MODE               := arm
LOCAL_MODULE                 := game

Enfin, la documentation fournie avec le ndk Android est particulièrement utile. Le mien se trouve à l'emplacement suivant:

Android-ndk-r6/documentation.html

Faites-moi savoir si vous avez d'autres questions. J'espère que cela t'aides! :)

6
Kevin Depue

Réponse très tardive ici, mais j'avais ce problème et aucune de ces solutions n'était utile. La solution s'avère simple: comme indiqué en détail ici , définissez une variable MY_LOCAL_PATH et réaffectez LOCAL_PATH à chaque fois:

MY_LOCAL_PATH := $(call my-dir)

LOCAL_PATH := $(MY_LOCAL_PATH)

... declare one module

include $(LOCAL_PATH)/foo/Android.mk

LOCAL_PATH := $(MY_LOCAL_PATH)

... declare another module
5
imh0tep

Je teste le code ci-dessous ok.

# I want only second-level mk files, that is the direct sub-directories
# in the current path.
include $(wildcard */*/Android.mk)
# include $(call all-subdir-makefiles)  ## $(wildcard $(call my-dir)/*/Android.mk)
# include $(call all-makefiles-under,$(LOCAL_PATH))

Android.mk

# I dunno why it's an empty result for $(call all-subdir-makefiles).
# $(info [^-^ print-test] all-subdir-makefiles = "$(call all-subdir-makefiles) ")
$(info [print-test] assert "jni/Android.mk" = "$(wildcard */Android.mk)") # print: jni/Android.mk
$(info [print-test] $$(wildcard */*/Android.mk) = "$(wildcard */*/Android.mk)") # print: jni/xxdir/Android.mk

J'imprime le résultat:

$ cd your_project_path
$ ndk-build
[print-test] assert "jni/Android.mk" = "jni/Android.mk"
[print-test] (wildcard */*/Android.mk) = "jni/HelloWorld/Android.mk jni/MessagePack/Android.mk"
0
samm