在Java中運行JS

在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專用版本。
central
在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。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章