如果JavaScript的代碼如下: function add(a, b) { return (a + b); }; var a = 12; var b = 25; var num = add(a, b); 則說明在JS中定義了一個(gè)函數(shù)add,,然后設(shè)定了a,、b兩個(gè)變量的值,,作為參數(shù)傳給add,,并將結(jié)果給變量num。 這里的函數(shù)add是在JS中定義的,,如果在C/C++程序中想要調(diào)用這個(gè)方法,,該怎么用呢? 在SpiderMonkey中有個(gè)JSAPI bool JS_CallFunctionName(JSContext* cx, JS::HandleObject obj, const char* name, const JS::HandleValueArray& args, JS::MutableHandleValue rval); 這個(gè)JSAPI就是根據(jù)JS中的函數(shù)名稱來找到并調(diào)用該函數(shù),。其中的參數(shù):cx,、obj都是熟悉的了;name是函數(shù)名稱,,針對(duì)上面的JS代碼就是add,;而args就是函數(shù)的參數(shù)數(shù)組,也就是上面JS代碼中a和b,;調(diào)用函數(shù)的返回值,,也就是add的計(jì)算結(jié)果就放在aval這個(gè)JS::Value里。 現(xiàn)在,,我們就可以代碼實(shí)現(xiàn)在C/C++中來調(diào)用在JS中定義的函數(shù)了,,代碼如下: //先定義一個(gè)包含2個(gè)元素的數(shù)組ele,,是根化了的數(shù)組 JS::AutoValueArray<2> ele(cx); //給數(shù)組的元素賦值,我們現(xiàn)在賦值18和24 ele[0].setInt32(18); ele[1].setInt32(24); //定義一個(gè)根化的變量rval,,用來接收返回值 JS::RootedValue rval(cx); //定義bool變量ok,,調(diào)用JS中的函數(shù)add,并將返回值賦給rval bool ok = JS_CallFunctionName(cx, obj, "add", ele, &rval); //根據(jù)ok的結(jié)果,,判斷函數(shù)調(diào)用是否成功,。成功就輸出結(jié)果;不成功就輸出無法調(diào)用,,并返回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; } //下面的代碼,,前面的筆記中已經(jīng)解釋過了,意思是把JS中的變量num結(jié)果顯示出來,。 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; } 運(yùn)行程序后,,結(jié)果顯示如下:
The JS function 'add' is called, the reult: 42 //這是c++調(diào)用add計(jì)算18+24的結(jié)果 The num is 37 //這是JS中12+25的結(jié)果,是由JS自動(dòng)執(zhí)行的結(jié)果 |
|