在Java中运行JS代码是一件很容易的事----对于服务端来说,直接调用ScriptEngineManager类即可;对于移动端安卓来说,运行JS代码往往需要借助Webview中的js引擎才能执行JS代码。
当然,也有不借助WebView的方式。这里记录两种,一是Rhino,二是J2V8。
因为在不需要WebView的大部分情况下都是借助JS来实现某些函数功能,所以就一个简单的Js函数举例说明即可。
JS代码为:
function myFunction(a, b)
{
return a * b;
}
使用Rhino
Rhino链接:Rhino
在github下载最新版本的jar包,或者使用其他方式导入后,可以直接开始使用。
public class JSInJavaDemo {
public static void main(String[] args) {
String jsCode = "function myFunction(a, b)\n" +
"{\n" +
" return a * b;\n" +
"}";
System.out.println(new JSInJavaDemo().getResultByAddtionalJS(jsCode, "myFunction", 2, 3));
}
public String getResultByAddtionalJS(String jsCode, String jsFunctionName, Object... values) {
String finalResult = null;
Context rhino = Context.enter();
rhino.setOptimizationLevel(-1);
try {
//初始化作用域
ScriptableObject scope = rhino.initStandardObjects();
//执行js
rhino.evaluateString(scope, jsCode, "demo", 1, null);
//js函数调用
Function function = (Function) scope.get(jsFunctionName, scope);
Object result = function.call(rhino, scope, scope, values);
finalResult = Context.toString(result);
} finally {
//释放资源
Context.exit();
}
return finalResult;
}
}
注意运行function是需要函数方法名的就可以了。
demo的最后输出:
6
其他的相关API可以Rhino JavaDoc中查看。
使用j2v8
j2v8链接:j2v8
j2v8 jar包下载:j2v8 aar
在安卓端可以选择下载android专用版本。
在Android中用起来是这样的:
public void testJs() {
V8 v8 = V8.createV8Runtime();
try{
String jsCode = "function myFunction(a, b)\n" +
"{\n" +
" return a * b;\n" +
"}";
v8.executeVoidScript(jsCode);
V8Array params = new V8Array(v8).push(2).push(3);
int result = v8.executeIntegerFunction("myFunction", params);
Log.w("result", "" + result);
}finally {
v8.release();
}
}
这是最基本的使用,因为暂时用不上,不再深究。
总结
Rhino最新包大小为1.23MB,是一个单独的jar包;
j2v8安卓包最小为4.2MB,是一个集合了jni的aar包,其中jar包大小为51KB,两个架构下的so包占据绝大部分空间。
两者的相似点在于运行方式相似,都是创建一个JS运行环境即Context或V8Runtime,然后执行完后都可以进行资源释放。
对于移动端来说,如果考虑到apk大小的话且功能不复杂,Rhino会是首选;如果考虑到更多的功能支持,首选是j2v8。