cocos2d-js 3.10 c++怎么调用js函数

请问大神,3.10 c++怎么调用js的函数
c++代码:
bool HttpManager::callJSDelegate(std::string jsFunctionName, std::string value, std::string tag)
{
js_proxy_t * p = jsb_get_native_proxy(this);
if (!p) return false;

JSContext *cx = ScriptingCore::getInstance()->getGlobalContext();
jsval args;
args = std_string_to_jsval(cx, value);
args = std_string_to_jsval(cx, tag);//
return ScriptingCore::getInstance()->executeFunctionWithOwner(OBJECT_TO_JSVAL(p->obj), jsFunctionName.c_str(), 2, args);

}

js代码:

testJSCallFunc =
function (cfgstr, name) {
*
cc*.log(
“------this is JS function” + name);
};

我是这么实现的,但是并没有调用到js得函数,我想是executeFunctionWithOwner传递参数的问题,有没有大神帮忙看看

executeFunctionWithOwner的意思是只能跟cocos原生的类绑定?全局的js的函数在c++调用不了么?如果用ScriptingCore的话?

好了,现在确定了,一定要用原生类!

因为最近一直有小伙伴问我这个问题怎么解决的,这里小菜鸟献上调用解决方法。

一、调用函数实现
第一个参数是想要调用的对象,第二个是对象类的函数名,后面是传递给js的参数。
bool JSScriptCallFun::callJSDelegate(cocos2d::Ref* nativeObj, const std::string& jsFunctionName, int value1, int value2, const char* content)
{
js_proxy_t * p = jsb_get_native_proxy(nativeObj);
if (!p) return false;

JSContext *cx = ScriptingCore::getInstance()->getGlobalContext();
jsval args[3];
args[0] = int32_to_jsval(cx, value1);
args[1] = int32_to_jsval(cx, value2);
args[2] = charptr_to_jsval(cx, content);

return ScriptingCore::getInstance()->executeFunctionWithOwner(OBJECT_TO_JSVAL(p->obj), jsFunctionName.c_str(), 3, args);

}

二、函数调用
你自己的类(继承自ref)* testObj = balabala;
JSScriptCallFun::getInstance()->callJSDelegate(testObj, “testCallBack”, 0, 0, “我是传递给js的数据”);

三、js回调函数实现
你自己的类 = {
testCallBack : function(v1,v2,v3){

}
};

四、jsb绑定
1、你自己的类必须注册一下jsb,也就是js如何调c++,自己去找帖子,很多大神都写了当然c++调js很多大神也写了

2、写个通用的专门给c++调用js的类,定义在js,保存在c++
比如我的代码是这么写的var AppGlobal = cc.Component.extend({定义在js)}
app.coreservice.setComponent(上面的对象);

保存在c++
void CoreService::setComponent(cocos2d::Component* pComponent)
{
m_compoent = pComponent;
m_compoent->retain();

};
然后你的所有c++调js的函数功能都可以统一的写在AppGlobal里了。

以上。纯手打,加代码复制,如有看不懂的,我也不负责。开玩笑的,大家多交流。若有问题,还请大神指点。

1赞

太感谢楼主了,本来一直不太了解c++怎么调用js的函数,网上找了好多看了也不太明白,知道看到楼主说的,才让我茅塞顿开!

楼主,我已经成功从c++调用到js的函数了,但是js函数的返回值怎么传回到c++,JS::MutableHandleValue好像是这种类型的变量存放返回值,这个怎么用的?

我自己搞定了,假设被调用的js函数的返回值是string类型,那么就是下面这样写就可以了
JS::RootedValue retval(ScriptingCore::getInstance()->getGlobalContext());
JS::MutableHandleValue retvalMultHandle(&retval);
ScriptingCore::getInstance()->executeFunctionWithOwner(OBJECT_TO_JSVAL(p->obj), jsFunctionName.c_str(), 3, args, retvalMultHandle);
jsval_to_std_string(ScriptingCore::getInstance()->getGlobalContext(), retvalMultHandle, &t_str);

其他类型应该也是以此类推就行了。

mark