我是JSCore和JNI的新手(从Android角度使用c ++)。我想通过JSEvaluateScript函数评估一个javascript。当我启动应用程序时,结果是可以的,但在我暂停应用程序或在应用程序打开时重新运行脚本后,它会随机提供“语法错误:Pasre错误”。奇怪的是,重启时相同的脚本运行正常(这意味着脚本没问题)。同样的脚本在iOS代码中与JSCore完美地运行。
每次运行脚本之前都会创建一个全局上下文,并像这样缓存它:
static JSGlobalContextRef globalContext = JSGlobalContextCreate(NULL);
我按照这样运行脚本:
void runJS(JNIEnv* env, jstring jsString)
{
const char *cString = env->GetStringUTFChars(jsString, 0);
JSStringRef scriptJS = JSStringCreateWithUTF8CString(cString);
JSValueRef exception = NULL;
if(JSCheckScriptSyntax(globalContext,scriptJS,NULL,0,&exception))
{
JSValueRef returnedValue = JSEvaluateScript(globalContext, scriptJS, NULL, NULL, 0, &exception);
if (exception)
{
LOGD("runJS: JSEvaluateScript exception");
JSValuePrint(globalContext, exception, NULL);
}
}
else if (exception)
{
LOGD("runJS: JSCheckScriptSyntax exception");
JSValuePrint(globalContext, exception, NULL);
}
env->ReleaseStringUTFChars(jsString, cString);
JSStringRelease(scriptJS);
}
我已经把我的头撞到了我正在考虑用另一个替换完整的Javascript引擎。任何形式的帮助都会很棒..
修改
事实证明我在一个创建问题的线程中调用runJS。但是我不能在主线程上运行它,因为我必须通过休眠线程来暂停JS解析的操作,并且睡眠主线程会睡眠一切。有什么想法吗?
答案 0 :(得分:2)
约翰,
此类问题通常与同一上下文中不同线程中的多个并发执行有关。 JSC不是线程安全的(对于相同的上下文),因此,确保每个上下文不会同时执行多个线程。