我是 JSCore 和 JNI 的新手(从 Android 的角度使用 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 解析的操作,而休眠主线程会使所有东西都休眠。有任何想法吗?