在Java中运行JS

25 篇文章 1 订阅
11 篇文章 0 订阅

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

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值