• 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脚本,尽管这个会带来一点点方便,但远没有达到理想的效果。故删之)

  • 相关阅读:
    十问5.12汶川大地震
    JZ035数组中的逆序对
    JZ037数字在排序数组中出现的次数
    JZ039平衡二叉树
    JZ033丑数
    JZ040数组中只出现一次的数字
    JZ032把数组排成最小的数
    JZ036两个链表的第一个公共结点
    JZ034第一个只出现一次的字符位置
    JZ031从 1 到 n 整数中 1 出现的次数
  • 原文地址:https://www.cnblogs.com/ldxsuanfa/p/10784588.html
  • Copyright © 2020-2023  润新知