关于v8的evalString的疑问

运行环境是IOS端 之前项目是2.0.10 所以js部分是jsc 最近升级了2.2.2 IOS64位变成了v8
se::ScriptEngine* se = se::ScriptEngine::getInstance();
se->evalString(jsCode);

上面是c++执行js的代码方法,但升级到v8以后遇到一个问题

+(NSString *)callGameJs:(NSString *)jsFunctionName jsonParam:(NSString )jsonString; {
if ([NSThread isMainThread]) {
se::ScriptEngine
se = se::ScriptEngine::getInstance();
NSString call = [NSString stringWithFormat:@“jscode”,jsFunctionName, jsonString];
se->evalString(call.UTF8String);
return jsonString;
} else {
dispatch_sync(dispatch_get_main_queue(), ^{
se::ScriptEngine
se = se::ScriptEngine::getInstance();
NSString *call = [NSString stringWithFormat:@“jscode”,jsFunctionName, jsonString];
se->evalString(call.UTF8String);
});
return jsonString;
}
}
之前2.0.10一直是按照上面的方法调用js的,也没出过什么问题,但是升到2.2.2以后这样调用的时候偶现会出现闪退,然后看了下v8的evalString实现发现

    // It is needed, or will crash if invoked from non C++ context, such as invoked from objective-c context(for example, handler of UIKit).
    v8::HandleScope handle_scope(_isolate);

上述代码的注释写了,如果不是c++的上下文,那就会crash,那是不是意味这不能在像上面那样调用evalString了,而要改成

+(NSString *)callGameJs:(NSString *)jsFunctionName jsonParam:(NSString *)jsonString; {
if ([NSThread isMainThread]) {
NSString *call = [NSString stringWithFormat:@“jscode”,jsFunctionName, jsonString];
callJSFun(call.UTF8String);
return jsonString;
} else {
dispatch_sync(dispatch_get_main_queue(), ^{
NSString *call = [NSString stringWithFormat:@“jscode”,jsFunctionName, jsonString];
callJSFun(call.UTF8String);
});
return jsonString;
}
}

void callJSFun(const char * jsCode) {
se::ScriptEngine* se = se::ScriptEngine::getInstance();
se->evalString(jsCode);
}

这样,多写一个c++的函数,在c++里面去调用evalString方法呢

因为c++不是很熟悉,希望知道的大佬帮忙解释,万分感谢:pray:

dispatch_async(dispatch_get_main_queue(), ^{
se::ScriptEngine::getInstance()->evalString(cocos2d::StringUtils::format(“jscode”,UserDateStr.c_str()).c_str() , -1 , new se::Value());
});

反正按照格式来就是了!别问我是啥意思,我也不知道!

感谢 我先改成你这样试试 咱们两区别是我用的同步 你是异步

NSString *ns_script = [NSString stringWithFormat:@"console.log('%@', '%@');", event, res];    
std::string script = [ns_script UTF8String];  
cocos2d::Application::getInstance()->getScheduler()->performFunctionInCocosThread([=](){        
    se::ScriptEngine::getInstance()->evalString(script.c_str());    
});
1赞

@953459485
大佬 意思就是还是线程的问题 不是我上面猜测的那个c++上下文的问题是吧

我用了会报 No member named ‘Application’ in namespace ‘cocos2d’
跟我用法有啥问题么?没有我就不动了

需要引入下的

#import “CCScheduler.h”

performFunctionInCocosThread 这里面用了c++必包,拉回了c++上下文,:joy:不过这个2.3文档才有,我说以前怎么没见过

我用2.2.2 那算了,不瞎搞了!反正没啥问题