CocoaChina2013春季开发者大会:张小明-Javascript绑定、Plugin和代码安全 …

<![CDATA[

本次大会更多相关报道,请访问CocoaChina2013春季开发者大会官网>>

下午技术探讨分会场首先是Cocos2D-X核心开发者张小明,他主要讲了三个方面的内容,包括Javascript绑定、Plugin和代码安全。Javascript绑定我打算从以下五个方面来讲,包括C++如何执行一个Javascript脚本,C++调用Javascript函数,Javascript如何调用C++ 函数绑定,C++类到Javascript和CXX Generator。以下是演讲实录:

张小明:大家好,我是Cocos2D-X的张小明。

今天主要想跟大家讲三个方面的内容,包括Javascript绑定、Plugin和代码安全。Javascript绑定我打算从以下五个方面来讲,包括C++如何执行一个Javascript脚本,C++调用Javascript函数,Javascript如何调用C++ 函数绑定,C++类到Javascript和CXX Generator。

张小明正在分享Cocos2d-x案例演示:Javascript绑定、集成第三方库及代码安全策略 C++执行Javascript脚本文件,在我们的软件里面绑定在Object下,执行完之后可以删除一些资源。旁边列出了一些函数,就是主要做这些工作的。等一下我们可以看一下具体的例子,我这边每一个都有具体的例子,而且我的例子里面都上传到网上了。

这是用来执行Javascript脚本的。这个参数的含义就是分配8兆内存,刚达到8兆的时候,Javascript机芯开始工作。创建一个Context8192,是一个比较好的值,大概就是说可以嵌入到多少层级,大家使用8192这个默认值就可以。接下来设置了一些变量,创建一个Global Object。我们这边的脚本是Hello World Cocos2d,大家到时候可以下载我的参数代码,就可以执行这个脚本,最后一行是整个脚本的返回值。从这里我们可以看一下,打印出来的结果应该是Hello World Cocos2d,然后我把Cocos2d去掉,让大家看看是否是Hello World,给大家演示一下,这边就是一个Hello World,通过这几个步骤就可以执行一个Javascript脚本。

接下来讲一下C++调用Javascript函数,前面的步骤是一样的,首先需要执行Javascript脚本。执行完Javascript脚本,这边不同之处在于Javascript函数触发是由C++调用过去的,通过上面列出的三个函数调用Javascript,这三个函数的功能是类似的,只不过第三个参数有点不同。从名字可以看出来,一个CallFunction,还有CallFunctionName,CallFunctionValue。这个例子里面就是Global Object,还有就是参数个数、参数的数据,最后有一个返回值。接下来做了什么?前面一样的,创建执行的欢迎,创建Global Object,创建初始函数。

接下来我们看一下Javascript的代码,第一个函数是GSFunction,通过函数打印出来。从这个代码来看,传入的函数是可以转为String的一个参数,最后变成Javascript脚本。上面不用管,是判断对象是否有这个属性,在我们这边是有。最主要的就是通过JSCallFunctionName,通过一个名字调用。Javascript脚本和C++脚本之间的交互基本上是通过一个JSValue的变量传输,Javascript脚本传输给C++,C++脚本传输给Javascript,都是通过JSValue这个脚本,和JS一样,有自己的一套规则。我们这边传了一个JS String的类型,这边打印的是JSFunction,会把Hello World打印出来,得出的结果就是Hello World Cocos2d加上去,这样也演示了如何传递,只不过参数变了而已。

Javascript如何调用C++函数。主要有三个步骤,首先也是一样,要初始化那些环境,接下来通过一个JSDefineFunction,注册到Javascript,Javascript就可以知道这个函数,就可以通过这个函数去调用。但是想一想,如果Javascript想调用一个C++函数,他应该知道什么东西呢?函数名字肯定是跑不掉的,还有函数个数。函数类型其实不是很关键的,因为在Javascript代码里面是没有类型这个概念的。所以说,假设参数类型不正确,它照样会传递过去,但是里面需要自己去做判断。我们再看一下,其实刚才的例子里面就已经包含了如何调用C++函数,大家看一下那个Log函数。这个Log函数不是Javascript原来就有的,这个Log函数其实是我们注册到Javascript。通过JSDefineFunction去注册C++函数,挂在Global下,触发Log函数的时候调用本地的Log函数,传输个数是1,这个方法不允许被删除。然后看一下这个Log是怎么定义的,Javascript调用C++函数,这个回传的Log是固定的,传一个执政,接下来是参数个数。

刚才说了,C++和JS交互,都是通过JSValue数据类型进行交互的。还有一个函数可以直接把Javascript传递出来的参数直接解析到对应的数据类型,这边的类型会解释成一个JSString,或者直接转化成一个IND。我们把这个值打印出来,刚才已经看到了Log的效果,我们就不再看了,主要是看一下流程大概是怎么样的。

如何绑定C++类到JS。从上面这个路来看有点复杂,大家想一想,如果C++想知道一个类的话需要知道哪些信息呢?名字肯定是少不了,还有构造函数,会有一个虚构函数的调用,于是注册那里边有哪些成员变量,包括静态、非静态的,这些信息全部都要注册到Javascript那边。从上面来看,是通过JS-InitClass注册到一个C++类,JS里面需要有一个JSClass,主要注册了两个内容,包括类的名字,还有就是需要有一个回调函数,其他的可以忽略,就是基本的默认值。这边有一个Prototype,比如说父类的类型是什么,这边是放入了一个父类的JSObject。这边是属性,有对应的名字,会触发相应的方法调用。在我们的例子当中没有演示,因为在我们绑定的代码中,基本上是不太建议直接使用变量去访问的,而是通过方法调用,这样可以达到比较好的控制。Function静态和非静态的其实是一样的,需要一个名字。当这个Function被调用的时候,需要调用一个本地的回调函数,就是Native Wrapper。

接下来我们看一下同样的例子,前面的步骤都是一样的,环境的建立。在初始化完标准类之后,就可以进行C++类的注册,这个顺序一定要注意,如果是在这个标准函数之前注册直接会崩溃。我们看一下做了哪些事情,首先我为了演示继承关系注册了一个父类和一个子类,父类叫Father,子类叫Son,Father很简单,只有一个函数,Son继承于Father,返回值,返回一个ID类型,还有一个静态成员函数Function3,当这些方法被调用的时候,都会触发相应的信息打印。有两个参数值,来验证传入的参数是否正确,然后把返回值返回出去,来验证返回值是否正确。接下来看是怎么注册的,注册类型,Father和Son基本上是一样的,因为Son比Father为了一步就是父类。这边需要一个JSClass,最主要的就是它的名字Son,还有当被虚构的时候,调用一个被虚构的函数,就是删除多余的一个对象。在这个例子当中比较偷懒,就是只创建了一个对象,也就是说每次构成函数被调用的时候,都创建一个对象。在这个开发过程当中,这需要是一一对应的,就是你的C++对象和生成出来的JS对象需要一一对应,能够互相找到对方。所以说我这个例子当中,如果创建一个以上的对象,就会复制过去,新构成一个虚构的,这个只是为了简化流程,否则会增加一些额外代码,但是不影响整个功能的实现。

<

p >接下来看一下注册成员方法,有一个Function2,还有一个静态成员方法Function3,这两个数据结构其实是一样的,只不过它们]
]>