有时,我们在开发中需要使用RTTI。什么?写的好的代码可以避免使用RTTI。不一定。什么情况下使用RTTI,一种很常见的例子,就是,我使用了一个父类指针容器,但是持有的是子类指针。并且,我需要调用子类指针的接口。这种情况下,就必须用RTTI了(或其他替代方案)。


使用RTTI的步骤。

#1.打开 项目目录\android\jni\Application.mk 

cocos2d-x学习笔记07:在cocos2d-x中使用RTTI_第1张图片


#2.

注释APP_STL := stlport_static
添加两行:
APP_STL := gnustl_static
APP_CPPFLAGS += -frtti

cocos2d-x学习笔记07:在cocos2d-x中使用RTTI_第2张图片


解释:NDK中默认关闭RTTI,所以使用-frtti开启。NDK中附带的stlport库不支持RTTI(也不支持异常)。所以,我们要将其替换为GNU的STL库。(NDK一共有四个STL库,system,stlport静态,stilport动态,gnu静态)

#3.

然后,使用cygwin控制台进入项目目录,clean一下。(最好直接删项目里的lib和obj文件夹,因为你改了编译选项,clean也是删不干净的。)
重新执行编译sh脚本即可



题外话:
     1.我测试了自己的手机,黑屏原因不明,连cocos2dx自带例子用RTTI编译都不行。另外,也不是所有平台都支持RTTI,android也是后续才增加支持的。所以你用了RTTI兼容性需考虑。
     2.RTTI会造成代码体积膨胀。效率可能会下降一点,不过我认为这不算什么问题。
     3.替代方案,最简单的使用cocos2dx的setTag和getTag。不过这要你自己定义一套符号系统,而且看起来傻一些。