运行环境是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++不是很熟悉,希望知道的大佬帮忙解释,万分感谢
不过这个2.3文档才有,我说以前怎么没见过