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

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

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

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQva2luZ2FiY2Rl/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="" />

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))

打印出来的内容例如以下

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQva2luZ2FiY2Rl/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="" />

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

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

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

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

  1. 分析cocos2d-x在Android上的编译过程(1):cocco2d-x是怎样生成的Android的文件夹结构

    当新建完一个cocos2d-x的项目后.进入到项目中的proj.android中,会看到例如以下的文件夹结构 在VS先把它编译,然后导入到Eclipse中,导入完后会看到多了几个文件 watermar ...

  2. Android 8.0编译过程

    Android编译系统中的Android.bp.Blueprint与Soonghttp://note.qidong.name/2017/08/android-blueprint/ 工具链关系 Andr ...

  3. 编译过程中,termcap.h 文件找不到路径 licli.a终于生成

    编译过程中,termcap.h      文件找不到路径   查看是linux  源码下找不到termcap.h文件   安装了所有关于*cap*的源码包也不起作用     今天终于解决了这个问题,搜 ...

  4. Android开发过程中在sh,py,mk文件中添加log信息的方法

    Android开发过程中在sh,py,mk文件中添加log信息的方法 在sh文件中: echo "this is a log info" + $info 在py文件中: print ...

  5. Android工程的编译过程

    现在很多人想对Android工程的编译和打包进行自动化,比如建立每日构建系统.自动生成发布文件等等.这些都需要我们对Android工程的编译和打包有一个深入的理解,至少要知道它的每一步都做了什么,需要 ...

  6. [置顶] 浅谈Android的资源编译过程

    Android APK 一.APK的结构以及生成 APK是Android Package的缩写,即Android application package文件或Android安装包.每个要安装到Andr ...

  7. webrtc在ubuntu14.04上的编译过程(12.04亦可)

    转自:http://blog.csdn.net/xiangjai/article/details/44409751 一.虚拟机环境搭建 1.安装ubuntu 14.04虚拟机: 因为可以屏蔽svn版本 ...

  8. 浅谈Android的资源编译过程

    转载自 http://www.cnblogs.com/dyllove98/p/3144950.html 好长,记录下,一次看完感觉像没看一样 Android APK 一.APK的结构以及生成 APK是 ...

  9. android源码编译过程

    1.下载好android源码包. 2.装好vm,ubuntu(如果能在实体机装linux更好). 3.安装所需要的deb包 在终端执行如下命令: sudo apt-get install flex b ...

随机推荐

  1. Elasticsearch模糊查询

    前缀查询 匹配包含具有指定前缀的项(not analyzed)的字段的文档.前缀查询对应 Lucene 的 PrefixQuery . 案例 GET /_search { "query&qu ...

  2. win10 Faster-RCNN训练自己数据集遇到的问题集锦 (转)

    题注: 在win10下训练实在是有太多坑了,在此感谢网上的前辈和大神,虽然有的还会把你引向另一个坑~~. 最近,用faster rcnn跑一些自己的数据,数据集为某遥感图像数据集——RSOD,标注格式 ...

  3. Halcon 彩色图片通道分割处理

    1.RGB通道:R红色,G绿色,B蓝色:R.G.B各占一个字节,取值范围在0—255:可代表的颜色数256*256*256==2^24 黑色区域是:R=G=B=0;   白色区域是:R=G=B=255 ...

  4. windows下IDEA的terminal配置bash命令

    使用git-bash.exe会单独打开一个窗口,而我们希望是在终端内置的命令行.这里我使用bash.exe 在IDEA中,打开settings,设置相应的bash路径 settings–>Too ...

  5. 解决space-between最后一排问题

    display:flex + justify-content: space-between 能够实现2端对齐的布局,这种布局在网页中很常见.不过这种布局方式有一个问题.举个例子,我们假设现在一排放4个 ...

  6. 5.动态代理AOP实现-DynamicProxy模式

    通过动态代理模式Interceptor实现在RegUser()方法本身业务前后加上一些自己的功能,如:PreProceed和PostProceed,即不修改UserProcessor类又能增加新功能 ...

  7. Fiddler 断点功能

    Fiddler 断点: (1) Fiddler 是以作为代理服务器的方式进行工作的,所以,本地应用与服务器传递的这些数据都会经过 Fiddler:(2) 有的时候,我们希望在传递的中间进行修改后再传递 ...

  8. lamda表达式和stream

    stream主要用于处理数据,看一下jdk的文档,并且主要处理集合对象: int sum = widgets.stream() .filter(w -> w.getColor() == RED) ...

  9. java基础编程

    java的类和常用编程模式还是要多练习,多手写java代码 return new String(filecontent, encoding); 看懂这个意思了吗?第一次见这个构造函数吧,而String ...

  10. web.py框架之i18n支持

    问题: 在web.py的模板文件中, 如何得到i18n的支持? Solution: 项目目录结构: proj/ |- code.py |- i18n/ |- messages.po |- en_US/ ...