如何在Android中使用ScriptEngineManager?

rrk*_*lli 5 android javax.script

import android.widget.Toast;
import javax.script.ScriptEngine;
import javax.script.ScriptEngineManager;
import javax.script.ScriptException;

 public void bEqual(View v) throws ScriptException {

       ScriptEngineManager mgr = new ScriptEngineManager();
       ScriptEngine engine = mgr.getEngineByName("JavaScript");
        String value = inputText.getText().toString();
        Toast.makeText(this,value,Toast.LENGTH_LONG).show();
        try{
            result = (double)engine.eval(value);
            Toast.makeText(this,String.format("%f",result),Toast.LENGTH_SHORT).show();
        }catch(Exception e){
            Toast.makeText(this,"Exception Raised",Toast.LENGTH_SHORT).show();
        }

    }
Run Code Online (Sandbox Code Playgroud)

这其中有什么问题吗?执行此操作时应用程序正在退出。它没有显示任何错误,但应用程序正在关闭

Mik*_*Chu 6

最简单的方法是在 Android 中使用 Mozilla Rhino [1],因为 ScriptEngine 及其依赖项需要耗时的设置和头痛。

导入 ff:

import org.mozilla.javascript.Context;
import org.mozilla.javascript.Scriptable;
import android.util.Log;
Run Code Online (Sandbox Code Playgroud)

您在方法中某处放置的代码:

    Context context = Context.enter(); // 
    context.setOptimizationLevel(-1); // this is required[2]
    Scriptable scope = context.initStandardObjects();
    Object result = context.evaluateString(scope, "18 > 17 and 18 < 100", "<cmd>", 1, null);
    Log.d("your-tag-here", "" + result);
Run Code Online (Sandbox Code Playgroud)

将其添加到您的 gradle 依赖项中。

implementation group: 'org.mozilla', name: 'rhino', version: '1.7.10'
Run Code Online (Sandbox Code Playgroud)

参考:

  1. Mozilla犀牛
  2. 解释为什么需要这行代码
  3. Mozilla Rhino 的 Maven 存储库


小智 2

javax.script软件包在 Android 上不可用。

如果您想使用 Javascript 引擎,则必须自己实现这些行为或使用已经存在的依赖项之一,例如rhino-android