Android Javascript引擎;需要用Rhino,J2V8等替代WebView

时间:2016-06-06 21:17:00

标签: javascript android v8 rhino j2v8

我们正试图用布局文件和某种类型的javascript引擎替换我们的webview和html。必须调用一个TON的javascript,我们有一个相当大的JavaScriptInterface需要JS引擎访问。我一直在尝试使用Rhino和J2V8,但是无法找到一种方法来让javascript访问完整的类方法或注释,其工作方式类似于为WebView注释方法。

如果有人有任何见解,我们将不胜感激!

谢谢, 乔恩

1 个答案:

答案 0 :(得分:2)

AFAIK JSV8没有“开箱即用”的解决方案。

但请看下面的例子:

public class V8ConsoleBridge implements JavaVoidCallback {
    @Override
    public void invoke(V8Object receiver, V8Array parameters) {
        StringBuilder sb = new StringBuilder();
        for (int i = 0; i < parameters.length(); ++i) {
            if (i > 0) {
                sb.append(", ");
            }
            Object object = parameters.get(i);
            if (object instanceof V8Object) {
                V8Object v8Object = (V8Object) object;
                sb.append(v8Object.toString());
                v8Object.release();
            } else {
                sb.append(object);
            }
        }
        Log.i("goebl-v8", sb.toString());
    }

    public static void register(V8 v8) {
        V8ConsoleBridge console = new V8ConsoleBridge();
        V8Object v8Console = new V8Object(v8);
        v8.add("console", v8Console);
        v8Console.registerJavaMethod(console, "debug");
        v8Console.registerJavaMethod(console, "log");
        v8Console.registerJavaMethod(console, "info");
        v8Console.registerJavaMethod(console, "warn");
        v8Console.registerJavaMethod(console, "error");
        v8Console.release();
    }
}

这是JS console对象访问Android日志记录系统的硬编码桥。

您可以将通用代码写入

  • 扫描您想要在JavaScript中公开的类,就像JavaScript-Interface for WebView一样,即使像@JavascriptInterface这样的注释只包含某些成员
  • 编写invoke的通用代码,它通过Java反射实际调用接收者类的成员。

当然,如果J2V8拥有这个有用的代码会很棒,因为许多项目可能会使用它。如果你有一个可靠的解决方案,请创建一个拉取请求,这样我也可以使用它: - )

如果您不介意深入涉及源代码,您可能会发现查看NativeScript非常有用。它们提供了一种通用方法来访问JavaScript中编译时已知的所有Java类,这些类通过反射在内部完成。好吧,我听说他们这样做了,我实际上没有读过NativeScript的源代码。在NativeScript中,您不必创建桥,它由构建和运行时系统神奇地完成。也许源代码可以激发您将想法移植到J2V8。