Rhino和 Nashorn是Java中运行Javascript两种常见的方式,但是在许多方面并没有满足我们的要求:
1.既不支持”初始类型 ”。 所有与平台的交互都需要包装成类,如Integer、Double或Boolean。
2.Nashorn不支持Android。
3.Rhino编译器不支持Android系统优化。
4. 无论是哪个引擎都不支持在Android上远程调试。
为了帮助解决这些问题,一个基于Java的新JavaScript运行项目: 谷歌的JavaScript引擎V8。 其运行库包称为J2V8是基于EPL的开源项目,Github项目地址,可以在MacOS Linux和Android上运行。
也就是说,Javascript可以在安卓系统上高效运行了。
不像其他JS运行时(包括JV8 Jav8), J2V8 采用基于原始的方法,导致更少的垃圾。 下面的脚本生成一个数组,其中包含第一个100斐波纳契数列。 这些数据可以直接访问,不需要包装成对象。 执行这个脚本Rhino需要7.5秒的10000倍。 相同的脚本运行J2V8上10000次只需要1秒。
var i;
var fib = []; //Initialize array!fib[0] = 1;
fib[1] = 1;
for(i=2; i<=100; i++)
{
fib[i] = fib[i-2] + fib[i-1];
}
fib;
用Java访问javascript数组:
V8Array array = v8.executeArrayScript(script);
double total = 0;
for (int i = 0; i < 100; i++) {
total += array.getDouble(i);
}
System.out.println(total);
array.release();
运行环境是是由V8通过其薄的JNI暴露部分API。 这种方法允许您不使用C / c++情况下将V8直接嵌入到Java应用程序。 J2v8目前目标V8版本3.26,
运行环境当前支持:V8Objects V8Arrays, 脚本调用以及从Java调用JS函数和注册Java函数作为JS回调函数。 还有一个小型库包可以将V8Objects和V8Arrays转换为Java Map和List。
最后,运行时支持远程调试,可以使用IDE工具,如Chrome Developer Tools for Eclipse。