前言
安卓里面做边缘计算的功能,需要动态编辑js代码执行
巨坑
java里面有ScriptEngineManager类,可以执行js
但在安卓里面没有这个类,javax下面的都不能执行
网上说的安卓里面用ScriptEngineManager的都是坑!
解决方法
使用Rhino
可以完美执行js代码
1、下载Rhino包
选择一个最新版本下载即可
2、安卓添加依赖
implementation files('libs\\rhino-1.7.14.jar')
也可以右键jar包,选择
3、编写代码
import org.mozilla.javascript.Context;
import org.mozilla.javascript.Function;
import org.mozilla.javascript.Scriptable;
public class JsRun
{
private static Object _lock = new Object();
private static Context _rhino = null;
private static Scriptable _scope = null;
private static void init()
{
if( _rhino==null )
{
synchronized (_lock)
{
if( _rhino==null )
{
_rhino = Context.enter();
_rhino.setOptimizationLevel(-1);
_scope = _rhino.initStandardObjects();
}
}
}
/* 这里是测试执行代码
String js = "function aa(){return 'sdfsdfsdf';}";
initScript(js);
js = "function bb(){return '11111';}";
initScript(js);
Object obj = callFunc("aa");
System.out.println(obj);
obj = callFunc("bb");
System.out.println(obj);*/
}
public static boolean initScript(String js)
{
init();
try {
_rhino.evaluateString(_scope, js, null, 1, null);
return true;
}
catch (Exception e) {
e.printStackTrace();
}
return false;
}
public static Object callFunc(String functionName, Object... functionParams)
{
try
{
Function function = (Function) _scope.get(functionName, _scope);
if( function != null )
return function.call(_rhino, _scope, _scope, functionParams);
}
catch (Exception e) {
e.printStackTrace();
}
return null;
}
}