关于jsb中js与c++的相互调用
1.js调用c++函数
在c++中声明函数,名为functionCpp,通过spidermonkey中jsapi
的JS_DefineFunction绑定一个js函数,名为functionJS,此函数名
可在js中直接调用,并可以传参,参数由functionCpp接收。
2.c++调用js函数
在js中声明函数,名为functionJS,通过spidermonkey中jsapi的
JS_CallFunctoionName(也可用JS_CallFunction,但参数不一样),
c++调用该函数,并传入参数,参数由functionJS接收。
以上两种方法皆可接收返回值。
示例代码:
js中
var haha = testjs("js run hahhahaha"); if (haha) { cc.log("return from c++ :true"); } else { cc.log("false"); } var testfunction = function (var1) { cc.log(var1); var testhaha = "return from js"; return testhaha; }
c++中
声明函数
JSBool testjs(JSContext *cx, uint32_t argc, jsval *vp) { if (argc > 0) { JSString *string = NULL; JS_ConvertArguments(cx, argc, JS_ARGV(cx, vp), "S", &string); if (string) { JSStringWrapper wrapper(string); //这块就有值了 CCLog(wrapper.get().c_str()); } } CCLog("js function"); return JS_TRUE; }
调用:
CCScriptEngineProtocol *pEngine = ScriptingCore::getInstance(); CCScriptEngineManager::sharedManager()->setScriptEngine(pEngine); ScriptingCore::getInstance()->runScript("hello.js"); JSContext *cx = sc->getGlobalContext(); JSObject *obj = sc->getGlobalObject(); JS_DefineFunction(cx, obj, "testjs", testjs, 2, JSPROP_READONLY | JSPROP_PERMANENT); jsval var1 = c_string_to_jsval(cx, "hahhahah"); jsval rval; JS_CallFunctionName(cx, obj, "testfunction", 1, &var1, &rval); JSString* pS = JS_ValueToString(ScriptingCore::getInstance()->getGlobalContext(), rval); JSStringWrapper pW(pS); CCLog(pW.get().c_str());