Javascript Binding (简称JSB) 自动绑定教程。

Cocos2d-x JSB 自动绑定bindings-generator (以下简称B-G) 使用心得

如果想弄清深入原理,推荐阅读 Cocos2D-x从C++到JS的进阶之路:http://blog.51cto.com/zt/560

B-G 是什么?
当使用JSB的时候,如果你想要使用的C++的类或者方法没有在已有JSB中被绑定,这时候,就可以使用B-G。 它可以生成相对应的C++的绑定文件和相对应的JS接口,届时,你只需要调用生成的相对应的JS接口,它将自动转换成原来的C++的类,相当于直接调用原来的C++方法或者类。

B-G生成主要流程:
准备好必要的工具 -> 准备好你要绑定的C++的文件 -> 写生成文件的.ini配置文件和.sh 脚本程序 -> 运行 .sh 脚本文件 -> 生成绑定文件 -> 测试绑定文件直至可以正常使用

必要的工具:

cocos2d-x引擎:http://cocos2d-x.org/projects/cocos2d-x/wiki/Download

python 2.7:http://www.python.org/download/ (目前引擎里面的bindings-generator只支持python2.7版本)

py-ymal: http://pyyaml.org/wiki/PyYAML (这是python的一个第三方包,下载页有不同系统的安装方式,可以参考。generator.py会调用到这个包。)

cheetah:http://www.cheetahtemplate.org/ (这也是python的一个第三方包,一个模板,generator.py会调用到这个包,安装方式跟py-ymal相同。)

libclang:http://llvm.org/releases/3.1/clang+llvm-3.1-x86_64-apple-darwin11.tar.gz (生成的时候需要用到的lib,注意master分支也就是2.2.2这个版本的引擎用3.1的,develop分支也就是3.0版本的引擎用3.3的)

Android NDK:http://dl.google.com/android/ndk/android-ndk-r8c-darwin-x86.tar.bz2 (测试的时候使用的v2.2.2用的r8c, 现在的3.0beta版需要用r9b)

.ini文件
参考例子:cocos2dx引擎根目录/tools/bindings-generator/test/test.ini
cocos2dx引擎根目录/tools/tojs/cocos2dx_extension.ini
cocos2dx引擎根目录/tools/tojs/cocos2dx.ini

.ini中部分参数的用法:

name: 单纯只是名称。

prefix: 最后生成的文件都会以这个命名前缀,如 prefix.cpp, prefix.hpp, prefix_api.js

classes: 你的所需转换的类的名称,必须是所导入的头文件中所有的类,这里可以使用正则表达式来加入多个类,参考cocox2dx.ini。

extra_arguments: 一些接口所需的系统参数。如clang包,android ndk包的引入所需的系统参数,写法可以参照以上三个.ini。

headers: 你所需要绑定的头文件路径。

target_namespace:命名空间。最后生成的JS文件的类,会以这个命名空间开头。例如你的类为sqlite,命名空间为cocos2dx,那么最后生成的就是cocos2dx.sqlite。

rename_functions:可以将你要绑定的方法的名称更改成你所要的。可以更改多个,用逗号隔开,写法参照 SqliteCpp::,这个就是将SqliteCpp中的sqlite3_ execCpp方法重命名为sqlite3_exec方法。

rename_classes :同上,重命名类。

skip :跳过你所不需要绑定的方法和类,于是就不生成。

.sh文件:主要调用程序,用来读取.ini配置文件和写部分参数。
参考例子:cocos2dx引擎根目录/tools/tojs/genbindings.sh
cocos2dx引擎根目录/tools/bindings-generator/test/test.sh

下面这句话便设定了通过调用generator.py来调用你的配置文件,并在你所设定的敌方生成你需要的绑定文件。 set -x LD_LIBRARY_PATH=${CLANG_ROOT}/lib PYTHON_BIN {CXX_GENERATOR_ROOT}/generator.py {TO_JS_ROOT}/sqlite.ini -s sqlite -o {TO_JS_ROOT}/sqliteBinding

写好.ini和.sh后,在cmd执行 sudo 你的.sh路径 ,便可以在你配置的地方找到你生成的文件。

2赞

Very Very Good!!!
学习了。

支持

— Begin quote from ____

引用楼主我爱cocostudio于2014-01-03 14:22发表的 Javascript Binding (简称JSB) 自动绑定教程。 :

Cocos2d-x JSB 自动绑定bindings-generator (以下简称B-G) 使用心得

B-G 是什么?
当使用JSB的时候,如果你想要使用的C++的类或者方法没有在已有JSB中被绑定,这时候,就可以使用B-G。 它可以生成相对应的C++的绑定文件和相对应的JS接口,届时,你只需要调用生成的相对应的JS接口,它将自动转换成原来的C++的类,相当于直接调用原来的C++方法或者类。
http://www.cocoachina.com/bbs/job.php?action=topost&tid=177904&pid=tpc

— End quote

这篇文章好像没有完?

已完,不懂再单独问我

OSError: dlopen(libclang.dylib, 6): image not found 请问我一直报这个错是怎么回事啊。。。

这是详细的错误信息

image not found? 找不到图片?

你的引擎版本是什么?

你试试把ndk版本换成r9c试试。

这样的错误,一般的有步骤没配置好。
配置每一步之后,都check一下,这个环境变量或者安装的程序,有没有正常运行。
比如: ymal安装之后,
print yaml.dump({‘name’: “The Cloak ‘Colluin’”, ‘depth’: 5, ‘rarity’: 45,
… ‘weight’: 10, ‘cost’: 50000, ‘flags’: ‘INT’, ‘WIS’, ‘SPEED’, ‘STEALTH’]})

name: The Cloak ‘Colluin’
rarity: 45
flags:
weight: 10
cost: 50000
depth: 5
(参考: http://www.pyyaml.org/wiki/PyYAML)

还有个地方需要注意,如果自己有安装python,这个和系统自带的python路径不一样。(最好使用python2.7).

我找到问题在哪了。是test.sh里面的地址设置得有问题。默认的地址我找不到。我现在改好了。。。但是又出问题了。。。

出现一个致命错误。
location = <SourceLocation file ‘/Users/vvvsnoopy/Documents/Tool/bindings-generator-master/test/simple_test/simple_class.h’, line 4, column 10>,
details = “‘string.h’ file not found”>
找不到string.h
本来是string
我估计是引用安卓路径没引用好。可是我看了下都引用好了。请问你遇到过类似的问题吗?

你这个simple_class.h是自己要绑的类吧,里面的string.h在他相对的路径下有文件吗,没有的话当然是找不到的啦

这个string是c++标准类。从现在来看如果py要转换c++,好像还是需编译c++。编译所需要的c++库,我想是引用安卓ndk的。以前配置安卓的cocos2dx开发环境一样,编译需要用安卓ndk的c++库来编译。。。我现在检查了好多次路径都还是不行。你的意思是。必须把这个类放到类似ndk里面的库里?

我没碰到这个问题。
是不是clang的路径不对?
在执行test.sh的时候,会有log输出,看下几个路径是不是正确的。
user.cfg和user.ini里面的路径也可以改一下。

Python 跟 clang是什么版本的?

是对的。几个路径。。。我都改了。sh里面的路径。

你到底啥引擎版本的来着。。
master分支也就是2.2.2这一系的要用 clang 3.1
develop分支也就是3.0beta这一系的要用clang 3.3 ndk r9b…
python都必须是2.7.。

py是2.7 clang是clang+llvm-3.1-x86_64-apple-darwin11。
我是参照你写的和官网结合起来的。目前感觉就差一步,昨天搞了一天。。。现在好蛋疼~ :6: 求帮忙解决啊。

那我蛋疼了。。。我用的3.1。官网用的3.3,我看你说必须3.1.我就换成3.1 了。。。。我试下3.3

郁闷。。。我修改一下,所以你早给我说你的引擎版本嘛。