代码之家  ›  专栏  ›  技术社区  ›  JGray

Android Javascript引擎;需要用Rhino、J2V8等替换WebView

  •  2
  • JGray  · 技术社区  · 9 年前

    我们正在尝试用布局文件和某种javascript引擎替换webview和html。必须调用大量的javascript,并且我们有一个很大的JavaScriptInterface,JS引擎需要访问它。我一直在尝试Rhino和J2V8,但无法找到让javascript访问完整类方法或注释的方法,这些方法的工作方式与您为WebView注释方法的方式类似。

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

    谢谢 乔恩

    1 回复  |  直到 9 年前
        1
  •  2
  •   hgoebl    9 年前

    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中公开的类,非常类似于WebView的JavaScript接口,即使有如下注释 @JavascriptInterface 只包括某些成员
    • 为编写通用代码 invoke 它实际上通过使用Java反射来调用receiver类的成员。

    当然,如果J2V8有这段有用的代码就好了,因为它可能被许多项目使用。如果您有一个可靠的解决方案,请创建一个拉取请求,以便我也可以使用它:-)

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