我在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();
}


但是在具有相同输入(a)的android studio中使用时engine.eval(a);
返回null!

Log cat of project

最佳答案

在Android Studio上,您正在使用Android框架构建项目。 JSR223默认情况下未嵌入Android的Java实现中。

但是您可以在图书馆中进行注册。

例如,使用https://github.com/APISENSE/rhino-android嵌入rhino,即Java 7的JavaScript引擎到Android。 (免责声明:我维护此库)



编辑后续的评论

我试图重现您的行为,这是我所拥有的:

使用犀牛作为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添加到依赖项中。

关于java - engine.eval()在Android Studio中返回null,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/46320972/

10-12 13:55
查看更多