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

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)

seul le premier include est analysé fine, autre Androïde.les fichiers mk sont en cours d'élaboration à odd paths. Des Suggestions?

mise à Jour: j'ai cassé mon environnement de développement... C'était OK au bureau, mais à la maison LOCAL_PATH:= $(call my-dir) définit LOCAL_PATH à NDK dir au lieu de project dir. C'est mon lot pour la construction:

set BASHPATH=K:cygwinbinbash
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 suis absolument d' ne comprends pas comment cette chose composer des chemins. J'ai des erreurs avec les chemins comme "/cygdrive/d/projet/jni//cygdrive/d/Soft/projet/jni/libos/src/libos.cpp". C'est après que j'ai décidé de spécifier tous les fichiers dans L'Android racine.mk au lieu d'inclure des sous-modules.

mise à Jour 2: Pas de chance, cela ne fonctionne pas:

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
demandé sur Violet Giraffe 2011-08-04 17:57:03

6 réponses

assez tard ici, mais si quelqu'un lit cette question, une façon de passer le problème des chemins cassés(pointant vers le NDK insté de vos fichiers à partir du jni) est d'avoir dans votre dossier jni:

include $(call all-subdir-makefiles)

et puis dans chaque sous-dossier (libos, libbase et ustils dans le cas D'OP) un androïde.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 second Androïde.mk avec le bon.c et deux.c fichiers dans un sous-dossier trouvé dans la jni dossier.

Notez que 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

va conduire à nouveau à un compilateur confus à la recherche de votre code source où se trouve le ndk.

alors, utilisez le LOCAL_PATH := $(appel mon-dir) EXACTEMENT sous cette forme dans chaque sous-répertoire de la jni et include $(appel à tous-subdir-makefiles) dans le jni lui-même et vous ne devriez pas avoir de problèmes.

Espérons que cela aidera quelqu'un.

Edit: ce comportement se produit parce que ce qui est conservé dans LOCAL_PATH n'est pas supprimé par include $(CLEAR_VARS).

20
répondu Mona Paun 2017-10-08 13:02:16

Voici comment je le fais.

Une mise en garde est que je ne mets aucun de mes codes source C++ dans le répertoire de compilation, car la plupart d'entre eux sont indépendants de la plate-forme. Cela signifie simplement que LOCAL_PATH n'est pas un sous-DIR du projet dir, et que les seuls fichiers dans /jni sont les 2 .MK files.

de toute façon, ici, est d'un haut niveau Android.mk et l'un de ceux pour un projet réel:

niveau Haut:

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

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

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 androïde inclus.mk:

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
répondu jimkberry 2011-08-05 14:27:21

Mon approah est comme ceci:

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

Remarque, qui comprend sont fait après la configuration des variables du module courant. Ceci est nécessaire parce que chaque include modifie la variable LOCAL_PATH (en fait elle modifie ce que $(call my-dir) retourne) et c'est pourquoi includes doit être fait en dernier.

cela compilera automatiquement tous les modules inclus (ou nettoiera ensuite s'il est appelé avec clean) et puis liera avec toutes les bibliothèques incluses.

cette configuration était testé 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

9
répondu user2021201 2013-11-19 04:35:12

Vous êtes sur la bonne voie. C'est la bonne façon d'inclure Android.fichiers mk dans un autre - il est en fait requis par le système de make Android. Une chose à noter est que la ligne pour effacer les variables doit 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 mentionnerais aussi qu'il y a d'autres drapeaux importants que vous pouvez ou ne pouvez pas vouloir mettre, y compris les suivants (un exemple d'un de mes 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, j'ai trouvé la documentation qui est intégré dans le ndk Android pour être particulièrement utile. Le mien est trouvé à l'emplacement suivant:

android-ndk-r6/documentation.html

Laissez-moi savoir si vous avez d'autres questions. Espérons que cette aide! :)

6
répondu Kevin Depue 2011-08-04 18:04:34

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 être simple: comme détaillé ici, définissez MY_LOCAL_PATH variable et réaffecter 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
3
répondu imh0tep 2015-10-21 15:38:56

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))

Androïde.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'ai imprimer 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
répondu samm 2016-03-22 11:23:12