VC驿站

 找回密码
 加入驿站

QQ登录

只需一步,快速开始

搜索
查看: 1688|回复: 2

[分享] SpiderMonkey_31.2.0版编程笔记 四___函数操作二

[复制链接]
04_avatar_middle
online_vip 发表于 2015-9-15 22:23:25 | 显示全部楼层 |阅读模式
本帖最后由 liehuo 于 2015-9-17 08:47 编辑

在这个帖子里主要演示如何用JS_DefineFunctions这个函数一次定义多个函数,先看看函数的声明原型:
bool JS_DefineFunctions(JSContext *cx, JS::Handle<JSObject*> obj, const JSFunctionSpec *fs);
重要的是最后一个参数JSFunctionSpec*的指针类型。我们想定义多个函数,那我们就声明一个JSFunctionSpec 类型的数组,然后把这个数组首地址传进去不就行了吗。是的,这样做完全可以,再来看看JSFunctionSpec 的原型吧:
struct JSFunctionSpec {
    const char      *name;
    JSNativeWrapper call;
    uint16_t        nargs;
    uint16_t        flags;
    const char      *selfHostedName;
};
原来是个结构体,只要定义一个这种结构的变量,然后一个一个的填写其中的数据成员就行了,一个个填写太过麻烦了吧,好在提供了一个宏简化这些操作,这个宏叫JS_FS。当你填完所有的JSFunctionSpec 变量的成员后还要以一个JSFunctionSpec 类型的全0结构结束,不过也提供了一个宏,叫JS_FS_END。好了,还是看代码吧,注意里面的注释。
  1. #include "stdafx.h"
  2. #include "include/jsapi.h"
  3. #pragma comment(lib,"lib/mozjs-31.lib")//这里直接用这种方式,是为了观看方便
  4. using namespace JS;
  5. static JSClass global_class = {
  6.         "global",
  7.         JSCLASS_GLOBAL_FLAGS,
  8.         JS_PropertyStub,          //增加属性
  9.         JS_DeletePropertyStub,    //删除属性
  10.         JS_PropertyStub,          //获取属性
  11.         JS_StrictPropertyStub,    //设置属性
  12.         JS_EnumerateStub,
  13.         JS_ResolveStub,
  14.         JS_ConvertStub
  15. };
  16. static bool JS_fun1(JSContext *cx, unsigned argc, jsval *vp)
  17. {
  18.         printf("fun1被调用\n");
  19.         JS::CallArgs args = CallArgsFromVp(argc, vp);
  20.         args.rval().setInt32(args[0].toInt32()+args[1].toInt32());//返回整形
  21.         return true;
  22. }
  23. static bool JS_fun2(JSContext *cx, unsigned argc, jsval *vp)
  24. {
  25.         printf("fun2被调用\n");
  26.         JS::CallArgs args = CallArgsFromVp(argc, vp);
  27.         args.rval().setNull();  //返回void类型
  28.         return true;
  29. }
  30. static const JSFunctionSpec my_methods[] = {
  31.         JS_FS("fun1", JS_fun1, 0, 0),//第一个参数是js里的函数名,第二个是对应的回调函数,其它不重要
  32.         JS_FS("fun2", JS_fun2, 0, 0),
  33.         JS_FS_END
  34. };
  35. void ExecScript(JSContext *cx)
  36. {
  37.         JSObject *obj = JS_NewGlobalObject(cx, &global_class, nullptr, FireOnNewGlobalHook);//创建一个新的JS对象,用作一个全局对象,但是要被根化,这里没有被根化。
  38.         //RootedObject global(cx, JS_NewGlobalObject(cx, &global_class, nullptr, FireOnNewGlobalHook));//上面和下面的可以并作中间的这一句。分开写是为了循序渐进
  39.         RootedObject global(cx, obj);//在当前的上下文环境,用创建的全局对象创建根化的全局对象
  40.         JSAutoCompartment ac(cx, global);//进入新全局对象的隔室,好像干什么坏事总是见不得人,非要躲在包厢里做坏事一样
  41.         JS_InitStandardClasses(cx, global);//初始化全局对象和其它js里的常规对象

  42.         bool b = JS_DefineFunctions(cx, global, my_methods);   //一次定义多个函数
  43.         if (!b)
  44.         {
  45.                 return;
  46.         }
  47.         RootedValue rval(cx);
  48.         JS::AutoValueArray<2> argv(cx);                                 //调用函数所需的参数
  49.         argv[0].setInt32(10);
  50.         argv[1].setInt32(20);
  51.         JS_CallFunctionName(cx, global, "fun1", argv, &rval);//通过函数名调用函数
  52.         int num = rval.toInt32();
  53.         printf("num=%d\n", num);
  54.         JS_CallFunctionName(cx, global, "fun2", argv, &rval);
  55.         printf("\n");
  56. }
  57. int _tmain(int argc, _TCHAR* argv[])
  58. {
  59.         JS_Init();     //初始化JS引擎,一定要有这步,不然其它的操作都是扯淡
  60.         JSRuntime *rt = JS_NewRuntime(8L * 1024 * 1024, JS_USE_HELPER_THREADS);//创建运行时,是不是跟以前的不一样了
  61.         if (!rt)
  62.                 return 1;
  63.         JSContext *cx = JS_NewContext(rt, 8192);//创建一个JS上下文,与运行时关联起来
  64.         if (!cx)
  65.                 return 1;
  66.         //****************************************************************************************
  67.             ExecScript(cx);
  68.         //****************************************************************************************
  69.         JS_DestroyContext(cx);//销毁创建的上下文
  70.         JS_DestroyRuntime(rt);//销毁释放运行时
  71.         JS_ShutDown();        //释放js引擎使用的所有资源
  72.         return 0;
  73. }
复制代码

SpiderMonkey_31.2.0版编程笔记 四___函数操作二
上一篇:SpiderMonkey_31.2.0版编程笔记 三___函数操作一
下一篇:SpiderMonkey_31.2.0版编程笔记 五___对象操作一





上一篇:SpiderMonkey_31.2.0版编程笔记 三___函数操作一
下一篇:SpiderMonkey_31.2.0版编程笔记 五___对象操作一
14_avatar_middle
在线会员 发表于 2015-11-17 16:17:52 | 显示全部楼层
感谢楼主的无私奉献。
26_avatar_middle
在线会员 发表于 2016-7-13 22:36:32 来自手机 | 显示全部楼层
我就笑笑不说话1468420271.09
您需要登录后才可以回帖 登录 | 加入驿站 qq_login

本版积分规则

关闭

站长提醒上一条 /2 下一条

QQ|小黑屋|手机版|VC驿站 ( 辽ICP备09019393号tongdun|网站地图wx_jqr

GMT+8, 2019-3-21 16:40

Powered by Discuz! X3.4

© 2009-2019 cctry.com

快速回复 返回顶部 返回列表