在使用NDK编译C/C++项目的过程中,免不了要编写Android.mk文件,其中最重要的就是android.mk源文件列表.
cpp文件位于android项目下的的不同文件夹和子文件夹下
按照通常的写法,在android.mk中,应该写入
LOCAL_SRC_FILES := ndk_test.cpp \
1.cpp \
2.cpp \
src/src1.cpp \
src/src2.cpp \
如果源文件过多会导致人的精神崩溃!!!!!
所以我们改造一下android.mk,让它可以自动查找源文件
引入多个目录(包括子目录)下的多个后缀名的源文件
在android.mk中添加下方代码# 扫描目录下的所有源文件 MY_FILES_PATH := $(LOCAL_PATH) \ $(LOCAL_PATH)/../../Classes MY_FILES_SUFFIX := %.cpp %.c %.cc My_All_Files := $(foreach src_path,$(MY_FILES_PATH), $(shell find "$(src_path)" -type f) ) My_All_Files := $(My_All_Files:$(MY_CPP_PATH)/./%=$(MY_CPP_PATH)%) MY_SRC_LIST := $(filter $(MY_FILES_SUFFIX),$(My_All_Files)) MY_SRC_LIST := $(MY_SRC_LIST:$(LOCAL_PATH)/%=%) LOCAL_SRC_FILES := $(MY_SRC_LIST)
以上代码中,变量MY_FILES_PATH保存源文件所在目录,MY_FILES_SUFFIX保存源文件的后缀名
由于都涉及到了shell命令, 导致不能完全在windows下工作, 下面我使用纯净的makefile语法重新编写了脚本 支持各个平台, 在 android.mk 中添加下方代码<span style="font-size:18px;"># 配置自己的源文件目录和源文件后缀名 MY_FILES_PATH := $(LOCAL_PATH) \ $(LOCAL_PATH)/../../Classes MY_FILES_SUFFIX := %.cpp %.c # 递归遍历目录下的所有的文件 rwildcard=$(wildcard $1$2) $(foreach d,$(wildcard $1*),$(call rwildcard,$d/,$2)) # 获取相应的源文件 MY_ALL_FILES := $(foreach src_path,$(MY_FILES_PATH), $(call rwildcard,$(src_path),*.*) ) MY_ALL_FILES := $(MY_ALL_FILES:$(MY_CPP_PATH)/./%=$(MY_CPP_PATH)%) MY_SRC_LIST := $(filter $(MY_FILES_SUFFIX),$(MY_ALL_FILES)) MY_SRC_LIST := $(MY_SRC_LIST:$(LOCAL_PATH)/%=%) # 去除字串的重复单词 define uniq = $(eval seen :=) $(foreach _,$1,$(if $(filter $_,${seen}),,$(eval seen += $_))) ${seen} endef # 递归遍历获取所有目录 MY_ALL_DIRS := $(dir $(foreach src_path,$(MY_FILES_PATH), $(call rwildcard,$(src_path),*/) ) ) MY_ALL_DIRS := $(call uniq,$(MY_ALL_DIRS)) # 赋值给NDK编译系统 LOCAL_SRC_FILES := $(MY_SRC_LIST) LOCAL_C_INCLUDES := $(MY_ALL_DIRS)</span>
参考文章:Update: Android.mk 中的 LOCAL_SRC_FILES, LOCAL_C_INCLUDES