cocos2d-js由于采用js语言,使得做一些native的功能比较受限,例如文件和目录操作、socket操作等。逼不得已,这时我们就不得不做jsbinding了。。
官方提供的jsbinding方法还是很人性化的,但是网上根本没有找到合适的资料,我就自己先写一篇吧。
用cocos new命令创建工程之后,在 "工程目录/tools/bindings-generator" 目录下有一个generator.py脚本,test目录下有官方示例,这些都是我们需要的。
步骤开始:
1、安装python2.7。然后安装PyYAML和Cheetah,不同平台安装方法可能有区别,Mac下直接到PyYAML和Cheetah的解压目录下执行sudo ./setup.py就可以。
2、把 "工程目录/tools/bindings-generator/test" 下面的test.ini、test.sh、userconf.ini.sample这三个文件拷贝一份到自己能找到的地方,并把userconf.ini.sample重命名为userconf.ini。
3、修改userconf.ini,指定androidndkdir、clangllvmdir、cxxgeneratordir的路径。
4、修改test.ini,需要修改的有:引用的头文件的路径、绑定的类名、命名空间。下面是我的配置,使用我的配置,只需要修改前7行就可以。后面的可以不管。
1 [testandroid] 2 name = red_bindings 3 prefix = red_bindings_auto 4 classes = RedSprite RedClass 5 cocosdir = /Users/staff/Documents/Red_Test/jsb_test/frameworks/js-bindings/cocos2d-x 6 customdir = /Users/staff/Documents/Red_Test/jsb_test/frameworks/runtime-src/Classes 7 headers = %(customdir)s/RedBindings.h 8 target_namespace = red 9 10 android_headers = -I%(androidndkdir)s/platforms/android-14/arch-arm/usr/include -I%(androidndkdir)s/sources/cxx-stl/gnu-libstdc++/4.7/libs/armeabi-v7a/include -I%(androidndkdir)s/sources/cxx-stl/gnu-libstdc++/4.7/include -I%(androidndkdir)s/sources/cxx-stl/gnu-libstdc++/4.8/libs/armeabi-v7a/include -I%(androidndkdir)s/sources/cxx-stl/gnu-libstdc++/4.8/include 11 android_flags = -D_SIZE_T_DEFINED_ 12 13 clang_headers = -I%(clangllvmdir)s/lib/clang/3.3/include 14 clang_flags = -nostdinc -x c++ -std=c++11 -U __SSE__ 15 16 cocos_headers = -I%(cocosdir)s -I%(cocosdir)s/cocos -I%(cocosdir)s/cocos/editor-support -I%(cocosdir)s/cocos/platform/android 17 18 cocos_flags = -DANDROID 19 20 extra_arguments = %(android_headers)s %(clang_headers)s %(customdir)s %(cocos_headers)s %(android_flags)s %(clang_flags)s %(cocos_flags)s %(extra_flags)s 21 22 remove_prefix = 23 skip = 24 base_objects = 25 abstract_classes = 26 classes_have_type_info = no 27 rename = 28 rename_functions = 29 rename_classes = 30 # classes for which there will be no "parent" lookup 31 classes_have_no_parents = 32 33 # base classes which will be skipped when their sub-classes found them. 34 base_classes_to_skip = 35 36 # Determining whether to use script object(js object) to control the lifecycle of native(cpp) object or the other way around. Supported values are 'yes' or 'no'. 37 script_control_cpp = yes