Android NDK: как включить Android.mk в другой Android.mk (иерархическая структура проекта)? - PullRequest
20 голосов
/ 04 августа 2011

Похоже, что это возможно, но мой скрипт выдает странные результаты:

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)

Только первое включение корректно анализируется, другие файлы Android.mk сортируются по нечетным путям.Предложения?

Обновление: Я нарушил свою строительную среду ... В офисе все было в порядке, но дома LOCAL_PATH: = $ (call my-dir) определяет LOCAL_PATH для NDK dirвместо проекта реж.Это мой пакет для сборки:

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

Обновление: я абсолютно не понимаю, как эта вещь образует пути.Я получаю ошибки с путями типа "/cygdrive/d/project/jni//cygdrive/d/Soft/project/jni/libos/src/libos.cpp '. Это после того, как я решил указать все файлы в корнеAndroid.mk вместо включения подмодулей.

Обновление 2: Не повезло, это тоже не работает:

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)

Ответы [ 6 ]

21 голосов
/ 16 августа 2012

Довольно поздно здесь, но в случае, если кто-то прочитает этот вопрос, один из способов преодолеть проблему неработающих путей (указывая на ndk, вставленный в ваши файлы из jni) - это иметь в папке jni:

include $(call all-subdir-makefiles)

, а затем в каждой его подпапке (libos, libbase и ustils в случае OP) Android.mk этой формы:

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

, где этот второй Android.mk входит с однимФайлы .c и two.c в подпапке, найденной в папке jni.

Обратите внимание, что попытка чего-либо как

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

снова приведет к сбивающему с толку компилятору, ищущему ваш исходный код, гдендк есть.

Итак, используйте LOCAL_PATH: = $ (call my-dir) ИМЕННО в этой форме в каждом подкаталоге jni и include $ (call all-subdir-makefiles) в самом jni, и у вас не должно быть проблем.

Надеюсь, это кому-нибудь поможет.

Редактировать: это происходит потому, что то, что хранится в LOCAL_PATH, не удаляется с помощью include $ (CLEAR_VARS).

14 голосов
/ 05 августа 2011

Вот как я это делаю.

Единственное предостережение в том, что я не помещаю никакой исходный код C ++ в каталог сборки, так как большая его часть не зависит от платформы.Это просто означает, что LOCAL_PATH не является подкаталогом dir проекта, и единственными файлами в / jni являются файлы 2 .mk.

В любом случае, вот полный Android.mk верхнего уровня и один из включенных для реального проекта:

Верхний уровень:

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)

... ивключенный 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))
10 голосов
/ 19 ноября 2013

Мой подход выглядит следующим образом:

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

Обратите внимание, что это включает в себя после установки текущих переменных модуля.Это необходимо, потому что каждое включение изменяет переменную LOCAL_PATH (фактически она модифицирует то, что возвращает $ (call my-dir)), и поэтому включение должно выполняться последним.

Это автоматически скомпилирует все включенные модули (или очистит затемесли вызывается с помощью clean), а затем связывается со всеми включенными библиотеками.

Эта установка была протестирована в реальном проекте и работает правильно.

ответ взят здесь: https://docs.google.com/document/d/1jDmWgVgorTY_njX68juH5vt0KY_FXWgxkxmi2v_W_a4/edit

6 голосов
/ 04 августа 2011

Вы на правильном пути. Это правильный способ включить файлы Android.mk в другой - это на самом деле требуется для системы Android make. Стоит отметить, что строка для очистки переменных должна появиться после включения других make-файлов, например:

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)

Я бы также упомянул, что есть и другие важные флаги, которые вы можете или не хотите устанавливать, включая следующие (пример из одного из моих make-файлов):

# 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

Наконец, я обнаружил, что документация, встроенная в Android ndk, особенно полезна. Шахта находится в следующем месте:

android-ndk-r6/documentation.html

Дайте мне знать, если у вас есть дополнительные вопросы. Надеюсь это поможет! :)

5 голосов
/ 21 октября 2015

Очень поздний ответ здесь, но у меня была эта проблема, и ни одно из этих решений не было полезным. Решение оказывается простым: как подробно здесь , установите переменную MY_LOCAL_PATH и перераспределяйте LOCAL_PATH каждый раз:

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
0 голосов
/ 22 марта 2016

Я проверяю приведенный ниже код в порядке.

# 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

Я печатаю результат:

$ 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"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...