Android JNI JavascriptCore JSEvaluateScript随机给出解析错误

Android JNI JavascriptCore JSEvaluateScript giving Parse Error randomly

本文关键字:错误 随机 JNI JavascriptCore JSEvaluateScript Android      更新时间:2023-09-26

我是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引擎来取代整个Javascript引擎。任何形式的帮助都将是伟大的。。

编辑:

事实证明,我在一个产生问题的线程中调用runJS。但是我不能在主线程上运行它,因为我必须通过睡眠线程来暂停JS解析的操作,而睡眠主线程将睡眠所有内容。有什么想法吗?

John,

这种问题通常与同一上下文中不同线程中的多个并发执行有关。JSC不是线程安全的(对于相同的上下文),因此,请确保每个上下文同时执行的线程不超过一个。