zoukankan      html  css  js  c++  java
  • cocos2d-x在Android上的编译过程(3):简化Android.mk文件的编写

    在编译动态库时。要求我们要去编写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脚本,尽管这个会带来一点点方便,但远没有达到理想的效果。故删之)

查看全文
  • 相关阅读:
    2019年技能学习计划
    EVM项目管理
    常用LINQ关键字用法汇总
    如何让Enum枚举实现异或操作
    使用COM打开Excel文档注意事项
    C#使用NPOI读写Excel的注意事项
    应用国际化多语言化实现方法
    DLL简单分析与调用方法
    C#读写Excel实践笔记
    Vue基础开发笔记
  • 原文地址:https://www.cnblogs.com/ldxsuanfa/p/10784588.html
  • Copyright © 2011-2022 走看看