studio reloj ndk_toolchain_version ndk application app_stl android android-ndk makefile

android - reloj - ndk-build



Android NDK: ¿cómo incluir Android.mk en otro Android.mk(estructura jerárquica del proyecto)? (6)

Así es como lo hago.

Una advertencia es que no pongo ningún código fuente de C ++ en el directorio de compilación, ya que la mayoría es independiente de la plataforma. Esto solo significa que LOCAL_PATH no es un subdirectorio del directorio del proyecto, y los únicos archivos en / jni son los archivos 2 .mk.

De todos modos, aquí hay un Android.mk de nivel superior completo y uno de los incluidos para un proyecto real:

Nivel superior:

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)

... y un Android.mk incluido:

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

Parece que es posible, pero mi script produce resultados extraños:

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)

Solo la primera inclusión está siendo analizada correctamente, otros archivos de Android.mk están siendo codificados en rutas impares. Sugerencias?

Actualización: he roto el entorno de mi edificio ... Estuvo bien en la oficina, pero en casa LOCAL_PATH: = $ (call my-dir) define LOCAL_PATH a NDK dir en lugar de dir del proyecto. Este es mi lote para la construcción:

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

Actualización: No entiendo absolutamente cómo esta cosa compone las rutas. Recibo errores con rutas como "/cygdrive/d/project/jni//cygdrive/d/Soft/project/jni/libos/src/libos.cpp ''. Esto es después de que decidí especificar todos los archivos en la raíz Android.mk en lugar de incluir submódulos.

Actualización 2: no hay suerte, esto tampoco funciona:

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)


Bastante tarde, pero en caso de que alguien lea esta pregunta, una forma de superar el problema de las rutas rotas (señalando el ndk instalado de sus archivos desde el jni) es tener en su carpeta jni:

include $(call all-subdir-makefiles)

y luego en cada subcarpeta de él (libos, libbase y ustils en el caso de OP) un Android.mk de esta forma:

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

donde se encuentra este segundo Android.mk con los archivos one.c y two.c en una subcarpeta que se encuentra en la carpeta jni.

Tenga en cuenta que intentar algo como

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

llevará nuevamente a un compilador confuso que busca el código fuente donde se encuentra el ndk.

Por lo tanto, use LOCAL_PATH: = $ (call my-dir) EXACTAMENTE en esta forma en cada subdirectorio del jni e incluya $ (call all-subdir-makefiles) en el jni mismo y no debería tener problemas.

Espero que esto ayude a alguien.

Editar: este comportamiento ocurre porque lo que se mantiene en LOCAL_PATH no se elimina con include $ (CLEAR_VARS).


Estás en el camino correcto. Esa es la forma correcta de incluir archivos Android.mk dentro de otro: en realidad, el sistema Android lo requiere. Una cosa a tener en cuenta es que la línea para borrar las variables debería aparecer -después de incluir los otros makefiles, así:

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)

También mencionaría que hay otras marcas importantes que puede o no desear establecer, incluyendo las siguientes (un ejemplo de uno de mis archivos 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

Finalmente, he encontrado que la documentación que viene incluida en el ndk de Android es especialmente útil. La mía se encuentra en la siguiente ubicación:

android-ndk-r6/documentation.html

Déjame saber si tienes más preguntas. ¡Espero que esto ayude! :)


Mi aprobación es así:

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

Tenga en cuenta que esto incluye se realizan después de la configuración de las variables del módulo actual. Esto es necesario porque cada inclusión modifica la variable LOCAL_PATH (en realidad modifica lo que devuelve $ (call my-dir)) y por eso es que las inclusiones se deben hacer al final.

Esto compilará automáticamente todos los módulos incluidos (o limpie luego si se llama con limpio) y luego se vinculará con todas las bibliotecas incluidas.

Esta configuración fue probada en un proyecto real y funciona correctamente.

respuesta tomada desde aquí: https://docs.google.com/document/d/1jDmWgVgorTY_njX68juH5vt0KY_FXWgxkxmi2v_W_a4/edit


Pruebo el siguiente código 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

Imprimo el resultado:

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


Respuesta muy tardía aquí, pero tuve este problema y ninguna de estas soluciones fue útil. La solución resulta ser sencilla: como se detalla aquí , establezca una variable MY_LOCAL_PATH y reasigne LOCAL_PATH cada vez:

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