使用V8 JavaScript引擎在没有Web视图的情况下执行JS lib

waw*_*los 16 javascript v8 webview

我正在开发一个JavaScript组件,负责向服务器发出请求并将结果分派给UI.通过在JavaScript中执行此操作,我可以在多种类型的UI中使用我的组件:Android应用程序,iOS应用程序,桌面应用程序(QT),Web应用程序......

所有这些UI都实例化了一个Web视图,因此当UI加载专用URL(webview.load("file://myfirstWebPage.html"))时,我的组件就会启动.

第一个网页加载所有JavaScript组件,一旦完成,UI就能够向JavaScript组件发出一些请求,这会向服务器发出请求,当它有响应时,它会将其发送回客户端( UI Android,UI iOS ...)

这个架构工作正常,但我想知道是否有另一种方法加载JavaScript组件而不使用每个客户端上的Web视图?

V8引擎可以帮助我吗?

And*_*rew 17

如果我理解您的问题,那么您正在寻找一种在不使用WebView的情况下跨多个平台(iOS,Android等)执行JavaScript的方法.该解决方案将是特定于平台的,因为即使底层WebView实现对于每个平台也是不同的.

对于Android,只要设备附带V8,您就可以通过其API创建新的V8 Context并使用它来执行您的JavaScript.该设备实际上必须随V8一起提供.这个答案可能会对你有所帮助.

对于使用JavaScriptCore的 iOS,iOS7中的最新开发已经允许您加载和运行任意JavaScript代码. 在这里阅读更多.

  • Verry有趣的回答.我会探讨你的意见 (2认同)

Wes*_*ley 6

我不知道如何使用V8,但你可以使用Rhino库代替.也没有涉及WebView.

首先下载Rhino,解压缩,将js.jar文件放在libs文件夹下.它非常小,所以你不必担心你的apk文件会因为这个外部jar而大得可笑.

这是一些执行JavaScript代码的简单代码.

Object[] params = new Object[] { "javaScriptParam" };

// Every Rhino VM begins with the enter()
// This Context is not Android's Context
Context rhino = Context.enter();

// Turn off optimization to make Rhino Android compatible
rhino.setOptimizationLevel(-1);
try {
    Scriptable scope = rhino.initStandardObjects();

    // Note the forth argument is 1, which means the JavaScript source has
    // been compressed to only one line using something like YUI
    rhino.evaluateString(scope, javaScriptCode, "JavaScript", 1, null);

    // Get the functionName defined in JavaScriptCode
    Object obj = scope.get(functionNameInJavaScriptCode, scope);

    if (obj instanceof Function) {
        Function jsFunction = (Function) obj;

        // Call the function with params
        Object jsResult = jsFunction.call(rhino, scope, scope, params);
        // Parse the jsResult object to a String
        String result = Context.toString(jsResult);
    }
} finally {
    Context.exit();
}
Run Code Online (Sandbox Code Playgroud)

您可以在我的帖子中查看更多详细信息.

  • 要在 android(跨平台)上进行这项工作,您需要调用 `Context.setOptimizationLevel(-1);`,其中 Context 是 Rhino 的 Context 类的一个实例。 (2认同)

Ang*_*elo 6

对于Android部分.我用过J2V8 JavaScript库.它是Google V8 JavaScript引擎的Java包装器.有关详细信息,请参见此处