Android Javascript 引擎;需要用Rhino、J2V8等替换WebView
Android Javascript Engine; Need to replace WebView with Rhino, J2V8, etc
我们正在尝试用布局文件和某种 javascript 引擎替换我们的 webview 和 html。有一个 javascript 的 TON 必须被调用,我们有一个相当大的 JavaScriptInterface 需要由 JS 引擎访问。我一直在试用 Rhino 和 J2V8,但无法找到一种方法让 javascript 访问完整的 class 方法或与 WebView 注释方法类似的注释。
如果有人有任何见解,将不胜感激!
谢谢,
乔恩
据我所知,JSV8 没有 "out-of-the-box" 解决方案。
但是看看下面的例子:
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 中公开的 class,很像 WebView 的 JavaScript-Interface,即使使用像
@JavascriptInterface
这样的注释只包含某些成员
- 为
invoke
编写通用代码,它实际上通过使用 Java 反射调用接收器 class 的成员。
当然如果J2V8有这个有用的代码就好了,因为它可能会被很多项目使用。当你有一个可靠的解决方案时,创建一个拉取请求,这样我也可以使用它:-)
如果您不介意深入研究源代码,您可能会发现查看 NativeScript 很有用。它们提供了一种通用方法来访问编译时在 JavaScript 中已知的所有 Java classes,这是通过反射在内部完成的。好吧,我听说他们是这样做的,我实际上没有阅读NativeScript的源代码。在 NativeScript 中,您不必创建桥接,它由构建和运行时系统神奇地完成。也许来源会启发您将想法移植到 J2V8。
我们正在尝试用布局文件和某种 javascript 引擎替换我们的 webview 和 html。有一个 javascript 的 TON 必须被调用,我们有一个相当大的 JavaScriptInterface 需要由 JS 引擎访问。我一直在试用 Rhino 和 J2V8,但无法找到一种方法让 javascript 访问完整的 class 方法或与 WebView 注释方法类似的注释。
如果有人有任何见解,将不胜感激!
谢谢, 乔恩
据我所知,JSV8 没有 "out-of-the-box" 解决方案。
但是看看下面的例子:
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 中公开的 class,很像 WebView 的 JavaScript-Interface,即使使用像
@JavascriptInterface
这样的注释只包含某些成员 - 为
invoke
编写通用代码,它实际上通过使用 Java 反射调用接收器 class 的成员。
当然如果J2V8有这个有用的代码就好了,因为它可能会被很多项目使用。当你有一个可靠的解决方案时,创建一个拉取请求,这样我也可以使用它:-)
如果您不介意深入研究源代码,您可能会发现查看 NativeScript 很有用。它们提供了一种通用方法来访问编译时在 JavaScript 中已知的所有 Java classes,这是通过反射在内部完成的。好吧,我听说他们是这样做的,我实际上没有阅读NativeScript的源代码。在 NativeScript 中,您不必创建桥接,它由构建和运行时系统神奇地完成。也许来源会启发您将想法移植到 J2V8。