使用Rhino在Android中调用此功能

时间:2015-06-01 05:59:23

标签: android rhino

我正在开发一个项目,我需要下载一个javascript并用它来计算一些值。这已经在iOS上工作,所以javascript似乎没问题。

这是精简的javascript(我删除了内容,因为我没有脚本):

var resultArray = [];

function calculateRemainingAmountForForecastWeeks(numberOfWeeks, weeklyDisposable, easing, safetyZone, safetyZoneEasing, overSpentThisWeek) {
  // Some calculations...
  resultArray[numberOfWeeks] = spentBeyondForecast;
}

我正在使用Rhino,这就是我的工作:

org.mozilla.javascript.Context rhino = org.mozilla.javascript.Context.enter();
rhino.setOptimizationLevel(-1);
try {
  Scriptable scope = rhino.initStandardObjects();
  rhino.evaluateString(scope, WeeklyApplication.getCalculatorJS(), "JavaScript", 0, null);
  Object obj = scope.get("calculateRemainingAmountForForecastWeeks", scope);
  if (obj instanceof Function) {
    Function jsFunction = (Function) obj;
    // Call the function with params
    Object[] params = new Object[]{numberOfWeeks, weeklyDisposable, easing, safetyZone, safetyZoneEasing, overSpentThisWeek};
    Object jsResult = jsFunction.call(rhino, scope, scope, params);
    // Parse the jsResult object to a String
    String result = org.mozilla.javascript.Context.toString(jsResult);
    Log.d(TAG, "SKN-calculate3=" + result);
  }
} finally {
  org.mozilla.javascript.Context.exit();
}

我知道这不是最优化的范围使用,但我只需先让它工作。我一直在结果字符串中得到“未定义”,我在这里做错了什么?

当我确实正常工作时,如何获取存储在“resultArray”中的值?

谢谢你 索伦

1 个答案:

答案 0 :(得分:0)

从您发布的代码看,函数calculateRemainingAmountForForecastWeeks()似乎没有返回任何内容,因此可以从中获取Undefined

resultArray获取价值很简单,因为它只是scope可编写脚本对象中的字段:

Object[] params = new Object[]{numberOfWeeks, weeklyDisposable, easing, safetyZone, safetyZoneEasing, overSpentThisWeek};
// function doesn't return anything
jsFunction.call(rhino, scope, scope, params);
NativeArray resultArray = (NativeArray) scope.get("resultArray", scope);
double result = ((Number) resultArray.get(numberOfWeeks)).getDoubleValue();
Log.d(TAG, "SKN-calculate3=" + result);

注意:当然,我不知道您的类型是什么,因此您可能需要更新此代码段以使其适合您。