列出 cocos2d-x Android 项目中的 cpp 文件

将 cocos2d-x 的项目移植到 android 平台时,需要用 build_native.sh 来编译 cpp 文件。而在此之前,还要将项目用到的所有 ../../Classes/*.cpp 增加到 proj.android/jni/Android.mk 文件的 LOCAL_SRC_FILES := hellocpp/main.cpp \ 这行下面。

通常一个大项目会有数十甚至数百个cpp文件,如果逐一手工添加的话,必定累死。基于 DRY原则(don’t repeat yourself),必须要有一个脚本来快速完成这件事。对于强大的 shell 只要这样一句就 ok 了。

find ../../Classes/. -name "*.cpp" | xargs

注意:以上命令需要在 Android.mk 所在的 proj.android/jni 目录下执行,这样才能得到正确的相对路径。这样可以得到如下内容:

MAC:jni mutoo$ find ../../Classes/. -name “*.cpp” | xargs
../../Classes/./AppDelegate.cpp ../../Classes/./Layer/GameLayerPlus.cpp ../../Classes/./Layer/MainLayer.cpp ../../Classes/./Layer/MenuLayer.cpp ../../Classes/./Layer/ModeLayer.cpp ../../Classes/./Layer/PauseLayer.cpp ../../Classes/./Layer/ResultLayer.cpp ../../Classes/./Layer/ScoreLayer.cpp ../../Classes/./Layer/SplashLayer.cpp ../../Classes/./Layer/TimerLayer.cpp ../../Classes/./Menu/ConfigMenu.cpp ../../Classes/./Menu/MainMenu.cpp ../../Classes/./Menu/ModeMenu.cpp ../../Classes/./Menu/PauseMenu.cpp ../../Classes/./Scene/GameScene.cpp ../../Classes/./Scene/MainMenuScene.cpp

其实在 proj.android/jni 的目录下已经有一个 shell 脚本可以完成这件事了,就是那个不起眼的 proj.android/jni/list.sh ,使用方法也很简单,指定一个参数作为要搜索的目录即可

./list.sh ../../Classes

但不幸的是,执行完了啥也没发生,还报错了:

MAC:jni mutoo$ ./list.sh ../../Classes
-bash: ./list.sh: /bin/bash^M: bad interpreter: No such file or directory

^M 是什么情况!?其实这是一个典型的编码错误,cocos2d-x-2.0~2.1都有这个问题。用 vim 神器打开 list.sh 查看其编码方式:

MAC:jni mutoo$ vi list.sh
:set ff?
fileformat=dos

这说明 list.sh 是一个 dos 编码的文件——不知是哪个大神动了这块码酪……不要紧,知错即改,拿来主义:

:set ff=unix
:set ff?
fileformat=unix

2013/02/19 Updated: 已经提交修改后的代码到 cocos2d-x@github

Good,现在历史错误被纠正了,保存重试之:

MAC:jni mutoo$ ./list.sh ../../Classes
../../Classes/AppDelegate.cpp \
../../Classes/Layer/GameLayerPlus.cpp \
../../Classes/Layer/MainLayer.cpp \
../../Classes/Layer/MenuLayer.cpp \
../../Classes/Layer/ModeLayer.cpp \
../../Classes/Layer/PauseLayer.cpp \
../../Classes/Layer/ResultLayer.cpp \
../../Classes/Layer/ScoreLayer.cpp \
../../Classes/Layer/SplashLayer.cpp \
../../Classes/Layer/TimerLayer.cpp \
../../Classes/Menu/ConfigMenu.cpp \
../../Classes/Menu/MainMenu.cpp \
../../Classes/Menu/ModeMenu.cpp \
../../Classes/Menu/PauseMenu.cpp \
../../Classes/Scene/GameScene.cpp \
../../Classes/Scene/MainMenuScene.cpp \

Well Done!但……这是最简单的方法吗?不,你还需要把这些内容复制到 Android.mk 里面,每次修改代码增加新类后,你得重复 list.sh 然后编辑 Android.mk 文件,最后再 build_native.sh ……

DRY!其实 Android.mk 这个 makefile 也是脚本……后面你懂的。