使用 Rhino 在 Android 中调用此函数
Calling this function in Android using 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();
}
我知道这不是最优化的范围使用,但我只需要先让它工作。我一直在结果字符串中得到 "undefined",我在这里做错了什么?
当我开始工作时,我该如何获取存储在 "resultArray" 中的值?
谢谢
索伦
从您发布的代码来看,函数 calculateRemainingAmountForForecastWeeks()
似乎没有 return 任何东西,因此可以从中获取 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);
注意:当然,我不知道您的类型是什么,所以您可能必须更新此代码段才能使其适合您。
我正在做一个项目,我需要下载 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();
}
我知道这不是最优化的范围使用,但我只需要先让它工作。我一直在结果字符串中得到 "undefined",我在这里做错了什么?
当我开始工作时,我该如何获取存储在 "resultArray" 中的值?
谢谢
索伦
从您发布的代码来看,函数 calculateRemainingAmountForForecastWeeks()
似乎没有 return 任何东西,因此可以从中获取 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);
注意:当然,我不知道您的类型是什么,所以您可能必须更新此代码段才能使其适合您。