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

标签 javascript android parsing java-native-interface

我是 JSCore 和 JNI 的新手(从 Android Angular 使用 c++)。我想通过 JSEvaluateScript 函数评估 javascript。当我启动应用程序时,结果没问题,但是当我暂停应用程序或在应用程序打开时重新运行脚本后,它会随机给出“语法错误:Pasre 错误”。奇怪的是,相同的脚本在重新启动时运行正常(这意味着脚本正常)。同样的脚本也可以通过 JSCore 在 iOS 代码中完美运行。

我每次运行脚本之前都会创建一个全局上下文并像这样缓存它:

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 解析的操作,并且休眠主线程会休眠所有内容。有什么想法吗?

最佳答案

约翰,

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

关于javascript - Android JNI JavascriptCore JSEvaluateScript 随机给出解析错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17998181/

相关文章:

javascript - React Native 可以用来构建我的蓝牙应用程序吗?

python - 解析空格分隔的命名字段

unit-testing - 单元测试 Rust Syn crate

javascript - Yii 客户端验证不适用于 ajax 加载的表单

javascript - Angularjs 用/n 显示消息

javascript - javascript中添加php信息的安全性

java - 将String[]添加到ArrayList中是否有错误?

javascript - 停止和启动页面溢出/单击时滚动的能力

android - 从资源设置壁纸

android - 处理长时间运行的应用程序