在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。