VC驿站

 找回密码
 加入驿站

QQ登录

只需一步,快速开始

搜索

学习SpiderMonkey60的心得笔记(五)调用JS中的函数

已有 30 次阅读2020-3-18 10:50 |个人分类:JavaScript引擎

如果JavaScript的代码如下:
          function add(a, b) {
              return (a + b);
         };
         var a = 12;
         var b = 25;
         var num = add(a, b);
则说明在JS中定义了一个函数add,然后设定了a、b两个变量的值,作为参数传给add,并将结果给变量num。
这里的函数add是在JS中定义的,如果在C/C++程序中想要调用这个方法,该怎么用呢?
在SpiderMonkey中有个JSAPI
         bool
         JS_CallFunctionName(JSContext* cx, JS::HandleObject obj, const char* name,
                                        const JS::HandleValueArray& args, JS::MutableHandleValue rval);

这个JSAPI就是根据JS中的函数名称来找到并调用该函数。其中的参数:cx、obj都是熟悉的了;name是函数名称,针对上面的JS代码就是add;而args就是函数的参数数组,也就是上面JS代码中a和b;调用函数的返回值,也就是add的计算结果就放在aval这个JS::Value里。
现在,我们就可以代码实现在C/C++中来调用在JS中定义的函数了,代码如下:
        //先定义一个包含2个元素的数组ele,是根化了的数组
        JS::AutoValueArray<2> ele(cx);
        //给数组的元素赋值,我们现在赋值18和24
        ele[0].setInt32(18);
        ele[1].setInt32(24);
        //定义一个根化的变量rval,用来接收返回值
        JS::RootedValue rval(cx);
        //定义bool变量ok,调用JS中的函数add,并将返回值赋给rval
        bool ok = JS_CallFunctionName(cx, obj, "add", ele, &rval);
        //根据ok的结果,判断函数调用是否成功。成功就输出结果;不成功就输出无法调用,并返回false
        if (ok) {
                printf("The JS function 'add' is called, the reult: %d\n", rval.toInt32());
        }
        else {
               printf("JS function isn't called");
               return false;
        }
        //下面的代码,前面的笔记中已经解释过了,意思是把JS中的变量num结果显示出来。
       ok = JS_GetProperty(cx, obj, "num", &rval);
        if (ok) {
                 printf("The num is %d\n", rval.toInt32());
        }
        else {
                printf("The num isn't found!");
                return false;
        }
运行程序后,结果显示如下:
 The JS function 'add' is called, the reult: 42 //这是c++调用add计算18+24的结果
 The num is 37 //这是JS中12+25的结果,是由JS自动执行的结果


路过

雷人

握手

鲜花

鸡蛋

评论 (0 个评论)

facelist

您需要登录后才可以评论 登录 | 加入驿站

关闭

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

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

GMT+8, 2020-5-26 05:00

Powered by CcTry.CoM

© 2009-2020 cctry.com

返回顶部