关于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());

 

你可能感兴趣的:(C++)