首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Android.mk :如何将Android.mk包含到另一个Android.mk(分层项目结构)中?

Android.mk :如何将Android.mk包含到另一个Android.mk(分层项目结构)中?
EN

Stack Overflow用户
提问于 2011-08-04 13:57:03
回答 6查看 59.8K关注 0票数 20

看起来这是可能的,但我的脚本产生了奇怪的结果:

代码语言:javascript
复制
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:= $(调用my)将LOCAL_PATH定义为NDK,而不是project。这是我的建筑批次:

代码语言:javascript
复制
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:失败,这也不起作用:

代码语言:javascript
复制
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)
EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2012-08-16 10:27:20

这里已经很晚了,但是如果有人读到了这个问题,一种解决路径中断问题(指向jni文件中的ndk )的方法是在jni文件夹中拥有:

代码语言:javascript
复制
include $(call all-subdir-makefiles)

然后,在它的每个子文件夹(libos、libbase和ustils,如果是OP)中,这个表单的Android.mk:

代码语言:javascript
复制
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和one.c和two.c文件位于jni文件夹中的一个子文件夹中。

请注意,尝试某事,如

代码语言:javascript
复制
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

将再次导致一个困惑的编译器正在寻找ndk所在的源代码。

因此,在jni的每个子目录中使用LOCAL_PATH := $(调用my-dir),并且在jni本身中包含$(调用所有子目录-makefiles),您应该没有问题。

希望这能帮上忙。

编辑:之所以会发生这种行为,是因为LOCAL_PATH中保存的内容没有被包含$(CLEAR_VARS)删除。

票数 21
EN

Stack Overflow用户

发布于 2011-08-05 14:27:21

我就是这样做的。

请注意,我没有将任何C++源代码放在build中,因为它大部分是独立于平台的。这仅仅意味着LOCAL_PATH不是项目dir的子dir,/jni中唯一的文件是2 .mk文件。

不管怎么说,这里有一个完整的顶级Android.mk,其中一个包含了一个真正的项目:

最高层:

代码语言:javascript
复制
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)

...and an包含了Android.mk:

代码语言:javascript
复制
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))
票数 13
EN

Stack Overflow用户

发布于 2013-11-19 04:35:12

我的方法是这样的:

代码语言:javascript
复制
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变量(实际上它修改了$(称为my-dir)返回的内容),这也是为什么包含必须最后完成的原因。

这将自动编译所有包含的模块(如果用clean调用,则会清除),然后与所有包含的库进行链接。

此设置在实际项目中进行了测试,并正常工作。

从这里得到的答案:A4/编辑

票数 10
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6942730

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档