it-swarm.dev

Android NDK: Wie kann ich Android.mk in eine andere Android.mk (hierarchische Projektstruktur) integrieren?

Sieht aus, als wäre es möglich, aber mein Skript führt zu ungeraden Ergebnissen:

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)

Nur das erste Include wird in Ordnung geparst, andere Android.mk-Dateien werden auf ungeraden Pfaden abgespielt Vorschläge?

Update: Ich habe meine Gebäudeumgebung gebrochen ... Im Büro war das OK, aber zu Hause LOCAL_PATH: = $ (my-dir benennen) definiert LOCAL_PATH als NDK-Verzeichnis anstelle des Projektverzeichnisses. Dies ist meine Charge zum Bauen: 

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%"

Update: Ich verstehe absolut nicht, wie dieses Ding Pfade zusammensetzt. Ich erhalte Fehler mit Pfaden wie "/cygdrive/d/project/jni//cygdrive/d/Soft/project/jni/libos/src/libos.cpp". Dies ist, nachdem ich beschlossen habe, alle Dateien im Stammverzeichnis anzugeben Android.mk anstelle von Submodulen.

Update 2: Kein Glück, das funktioniert auch nicht:

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

Ziemlich spät hier, aber für den Fall, dass jemand diese Frage liest, besteht eine Möglichkeit, das Problem der beschädigten Pfade (das auf die ndk-Datei Ihrer Dateien vom jni zeigt) zu überwinden, in Ihrem jni-Ordner:

include $(call all-subdir-makefiles)

und dann in jedem Unterordner (libos, libbase und ustils in OP) ein Android.mk dieser Form:

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

wo dieses zweite Android.mk mit den Dateien one.c und two.c in einem Unterordner im Ordner jni gefunden wird.

Beachten Sie, dass etwas versucht wird

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

führt erneut zu einem verwirrten Compiler, der nach Ihrem Quellcode sucht, wo sich der ndk befindet. 

Verwenden Sie also LOCAL_PATH: = $ (Aufruf my-dir) EXACTLY in dieser Form in jedem Unterverzeichnis von jni und include $ (call-all-subdir-makefiles) im jni selbst und Sie sollten dies nicht tun Ich habe keine Probleme. 

Hoffe das hilft jemandem.

Bearbeiten: Dieses Verhalten tritt auf, weil das, was in LOCAL_PATH gespeichert wird, nicht durch das Include $ (CLEAR_VARS) gelöscht wird.

21
Mona Paun

So mache ich es. 

Ein Nachteil ist, dass ich keinen C++ - Quellcode in das Build-Verzeichnis stecke, da der größte Teil plattformunabhängig ist. Dies bedeutet lediglich, dass LOCAL_PATH kein Unterverzeichnis des Projektverzeichnisses ist und die einzigen Dateien in/jni die 2 .mk-Dateien sind. 

Jedenfalls ist hier ein vollständiges Android.mk der obersten Ebene und eines der enthaltenen für ein reales Projekt:

Höchststufe:

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)

... und ein enthaltenes Android.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
jimkberry

Mein Ansatz ist so:

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

Beachten Sie, dass das Einrichten der aktuellen Modulvariablen after erfolgt. Dies ist erforderlich, da bei jedem Include die LOCAL_PATH-Variable geändert wird (tatsächlich ändert sich, was $ (my-dir-Aufruf) zurückgibt) und deshalb müssen Include-Elemente zuletzt ausgeführt werden.

Dadurch werden alle enthaltenen Module automatisch kompiliert (oder clean, wenn sie mit clean aufgerufen werden) und dann eine Verknüpfung mit allen enthaltenen Bibliotheken hergestellt.

Dieses Setup wurde in einem realen Projekt getestet und funktioniert ordnungsgemäß.

antwort von hier aus: https://docs.google.com/document/d/1jDmWgVgorTY_njX68juH5vt0KY_FXWgxkxmi2v_W_a4/edit

10
user2021201

Du bist auf dem richtigen Weg. Dies ist der richtige Weg, um Android.mk-Dateien in eine andere einzubinden. Dies wird vom Android-Make-System tatsächlich benötigt. Zu beachten ist, dass die Zeile zum Löschen von Variablen erscheinen sollte, nachdem Sie die anderen Makefiles wie folgt enthalten:

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)

Ich möchte auch erwähnen, dass es andere wichtige Flags gibt, die Sie möglicherweise nicht setzen möchten, einschließlich der folgenden (ein Beispiel aus einem meiner 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

Schließlich habe ich die Dokumentation, die in Android NDS eingebettet ist, besonders hilfreich gefunden. Meiner befindet sich an folgendem Ort:

Android-ndk-r6/documentation.html

Lassen Sie mich wissen, wenn Sie weitere Fragen haben. Hoffe das hilft! :)

6
Kevin Depue

Antwort hier sehr spät, aber ich hatte dieses Problem und keine dieser Lösungen war nützlich. Die Lösung stellt sich als unkompliziert heraus: Setzen Sie wie detailliert hier eine MY_LOCAL_PATH-Variable fest und LOCAL_PATH jedes Mal neu:

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

Ich teste den folgenden Code in Ordnung.

# 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

Ich drucke das Ergebnis aus:

$ 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