engine.eval()在android studio中返回null

时间:2017-09-20 11:35:03

标签: java android

我在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!

Log cat of project

1 个答案:

答案 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添加到依赖项中。