cocos2d-x在Android上的编译过程(3):简化Android.mk文件的编写

本文介绍了一种自动化处理Android.mk文件的方法,通过定义宏和使用递归调用,实现动态库编译文件的自动检索,避免了手动修改所带来的繁琐。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在编译动态库时。要求我们要去编写jni/Android.mk文件。告诉编译器编译出来的库时应包括包括编译文件和其它引用库。但对于一个大项目来说,维护这个文件肯定是一件比較繁琐的事情。由于每加一个文件或减一个文件等就要改下Android.mk来又一次生成打包文件。所以非常有必要对这个文件进行自己主动化处理,就是在绝大部分的情况下都不须要改动此文件。

由于我没有从cocos2d-x引擎中自带的那些Android.mk找到好的样例,就在网上搜索makefile的编写技巧。最终找到了较好的解决方式。

在本利中的Classes的文件结构例如以下


1. 首先在Android.mk中增加下面代码

#遍历出Classes下全部的cpp和c文件,也遍历出jni/hellocpp下全部的cpp文件
define walk
	$(subst jni/, ,$(wildcard $(2)/*.cpp) $(filter %.cpp %.c, $(wildcard $(1)) $(foreach v, $(wildcard $(1)/*), $(call walk, $(v))))) 
endef
#将上面遍历出的文件列表赋给CPP_FILES
CPP_FILES := $(call walk, $(LOCAL_PATH)/../../Classes, $(LOCAL_PATH)/hellocpp)
LOCAL_SRC_FILES := $(CPP_FILES)
#打印測试
$(warning	$(LOCAL_SRC_FILES))

打印出来的内容例如以下


可见LOCAL_SRC_FILES的值是我们所须要的

假设项目中的头文件不是以相对目录引入的话还要对LOCAL_C_INCLUDES进行改动

继续在Android.mk中增加下面代码

ALL_DIR :=
#获取Classes下的全部目录(假设一个目录下有两个文件的话则FILES_DIR出现两个反复的目录名)
FILES_DIR := $(dir $(filter ../../%, $(LOCAL_SRC_FILES)))
#去掉FILES_DIR中的反复目录名,此时的FILES_DIR的每一个目录名的最后面会多出一个/
$(foreach n, $(FILES_DIR), $(if $(filter $(n), $(ALL_DIR)), , $(eval ALL_DIR += $(n))))
#给FILES_DIR的每一个目录名的后面加上一/
C_INCLUDES := $(foreach m, $(ALL_DIR), $(LOCAL_PATH)/$(m)/)
#去掉FILES_DIR的每隔目录名的//( 由于上面在每一个目录名的最后面多加了一个/ 所以要去掉//)
C_INCLUDES := $(subst //,,$(C_INCLUDES))
LOCAL_C_INCLUDES := $(C_INCLUDES)
#打印測试
$(warning	$(LOCAL_C_INCLUDES))

打印出来的内容例如以下


可见LOCAL_C_INCLUDES的值是我们所须要的


这样就不用怎么每次编译就要去改动Android.mk文件了

(ps: 之前也写过一篇关于自己主动生成LOCAL_SRC_FILES的python脚本,尽管这个会带来一点点方便,但远没有达到理想的效果。故删之)

转载于:https://www.cnblogs.com/ldxsuanfa/p/10784588.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值