我在java中使用了这段代码,效果很好
public String execute(String s)
{
Object result = null;
ScriptEngineManager manager = new ScriptEngineManager();
ScriptEngine engine = manager.getEngineByName("JavaScript");
if (engine == null) {
throw new UnsupportedOperationException("JavaScript scripting engine not found");
}
Log.i("s",s);
try {
result = engine.eval(s);
} catch (Exception e) {
Log.i("e",e.toString());
}
return result.toString();
}
但在android studio中使用相同的输入时(a)engine.eval(a);
返回null!
答案 0 :(得分:0)
在Android-Studio上,您正在使用Android框架构建项目。默认情况下,JSR223未嵌入Android的Java实现中。
但是你可以用库注册它们。
例如https://github.com/APISENSE/rhino-android嵌入rhino
,javascript引擎从Java 7进入Android。 (免责声明:我维护这个库)
修改后续评论
我试图重现你的行为,这就是我所拥有的:
使用 rhino 作为ScriptEngine
名称时:
09-20 11:13:16.151 5997-5997/? I/TEST: using Script engine name: rhino
09-20 11:13:16.159 5997-5997/? E/AndroidRuntime: FATAL EXCEPTION: main
Process: test.app, PID: 5997
java.lang.NoClassDefFoundError: com.sun.script.javascript.ExternalScriptable
at com.sun.script.javascript.RhinoScriptEngine.<init>(RhinoScriptEngine.java:43)
at com.sun.script.javascript.RhinoScriptEngineFactory.getScriptEngine(RhinoScriptEngineFactory.java:51)
at javax.script.ScriptEngineManager.getEngineByName(ScriptEngineManager.java:154)
at test.app.Test.execute(Test.java:33)
at test.app.Test.scriptMethod(Test.java:23)
at test.app.Test.onCreate(Test.java:17)
[...]
使用 JavaScript 作为ScriptEngine
名称:
09-20 11:16:16.883 8776-8776/? I/TEST: using Script engine name: JavaScript
09-20 11:16:16.883 8776-8776/test.app E/AndroidRuntime: FATAL EXCEPTION: main
Process: test.app, PID: 8776
java.lang.RuntimeException: Unable to start activity ComponentInfo{test.app/test.app.Test}: java.lang.UnsupportedOperationException: Engine not found: JavaScript
[...]
Caused by: java.lang.UnsupportedOperationException: Engine not found: JavaScript
at test.app.Test.execute(Test.java:37)
at test.app.Test.scriptMethod(Test.java:23)
at test.app.Test.onCreate(Test.java:17)
[...]
正如您所看到的, rhino 正在尝试实现ScriptEngine
,但是一个类在加载时会抛出错误(com.sun.script.javascript.ExternalScriptable
)。
问题是你的jar依赖包含JSR223和一些引擎定义,但不包含实际的脚本引擎。
要纠正这种情况,您可能需要将an actual rhino implementation添加到依赖项中。