发个帖作为今天折腾了n久的总结吧,已经能绑定非cocos2d的类了
但是目前我仍然没法绑定cocos2d相关的类,也就是说不能有cocos2d.h这样的文件引用,
我折腾了genbindings.py了很久,仍然是里面的路径或者是什么不对,还望大神指点
----------------首先要安装3个破玩意儿----------
python一般都安装了吧,然后有人包括我在内,看了网上的教程后都是直接下PyYAML和Cheetah安装的,
好像已经装上去了但是是有问题的- -大坑!!!请用下面的方式安装
打开tools/tojs/README.mdown 按照里面的说明逐次运行
sudo easy_install pip
sudo pip install PyYAML
sudo pip install Cheetah
欧耶pip真是太好了,这样才能正确安装
----------------然后看看test的类--------------
tools/bindings-generator/test
到这里的时候,大部分人包括我都是直接运行test.sh,如果上面配置正确的话好像就成功了
慢着!!!!!
这里有个东西又是大部分教程没说的,test.ini里面的 target_namespace = ts 请必须填一个东西,不然生成的类是错的!!
//默认情况下cpp文件输出,注意这里明显是错的,擦蛋你的ns是怎么来的
void register_all_autogentestbindings(JSContext* cx, JS::HandleObject obj) {
js_register_autogentestbindings_SimpleNativeClass(cx, ns);
}
//填了ts之后,这里变成,正确的
void register_all_autogentestbindings(JSContext* cx, JS::HandleObject obj) {
// Get the ns
JS::RootedObject ns(cx);
get_or_create_js_obj(cx, obj, "ts", &ns);
js_register_autogentestbindings_SimpleNativeClass(cx, ns);
}
```
还有一个小问题,打开simple_class,后面xcode会说错误的,注释掉这里吧
void SimpleNativeClass::setAnotherMoreComplexField(const char *str)
{
//if (m_anotherMoreComplexField) {
// free(m_anotherMoreComplexField);
//}
//size_t len = strlen(str);
//m_anotherMoreComplexField = (char *)malloc(len);
//memcpy(m_anotherMoreComplexField, str, len);
}
```
然后我们愉快的运行./test.sh ,将生成的js文件放到scipt中,将simple_class.h,simple_class.cpp,autogentestbindings.hpp,autogentestbindings.cpp放到Class文件夹中
在xcode中添加文件,然后在js_module_register.h中加入
simple_class.h和autogentestbindings.hpp这两个头文件,在下面位置加
sc->addRegisterCallback(register_all_autogentestbindings);
这个时候,请用xcode编译一个mac的模拟器,这个模拟器请不要在cocoside里面构建,不知为何有时可以有时不可以的会弹出
CocosJSBindTest-desktop Unable to load nib file: MainMenu, exiting
这个错误,根本启动不了,坑!!!
xcode构建完模拟器之后可以在runtime或者simulator里面看到它,然后在cocoside里面把模拟器设置成它
然后在Helloworld中添加
var myClass = new ts.SimpleNativeClass();
var myStr = myClass.returnsACString();
cc.log("customClass's msg is : " + myStr);
var label2 = new cc.LabelTTF(myStr,"",20.0);
label2.setPosition(cc.winSize.width/2,cc.winSize.height/2);
this.addChild(label2,2);
就可以看到有label的字了,慢着,这个cc.log是没有输出的,因为默认是release的,请设为debug才有log输出
------------------跑在安卓上--------------------
要跑在安卓上的话还需在frameworks/runtime-src/proj.android/jni/Android.mk里面添加上simple_class和autogentestbindings的路径
LOCAL_SRC_FILES := \
../../Classes/AppDelegate.cpp \
../../Classes/ide-support/SimpleConfigParser.cpp \
../../Classes/ide-support/RuntimeJsImpl.cpp \
../../Classes/simple_class.cpp \
../../Classes/autogentestbindings.cpp \
hellojavascript/main.cpp
编译,搞定
-----------下面是我目前还搞不定的------
---------------------运行genbindings.py的输出,望大神指点-------------
File "/Users/ZY/Documents/otherManGame/CocosJSBindTest/tools/bindings-generator/clang/cindex.py", line 2113, in parse
self)
File "/Users/ZY/Documents/otherManGame/CocosJSBindTest/tools/bindings-generator/clang/cindex.py", line 2225, in from_source
raise TranslationUnitLoadError("Error parsing translation unit.")
TranslationUnitLoadError: Error parsing translation unit.
-------------------------------------
Generating javascript bindings fails.
-------------------------------------