Rhino: Как да извикате JS функция от Java

Използвам Mozilla Rhino 1.7r2 (не JDK версията) и искам да извикам JS функция от Java.

Моята JS функция е така:

function abc(x,y)
{
  return x+y
}

Как да направя това?

Редактиране: (JS функцията е в отделен файл)


person instantsetsuna    schedule 22.10.2010    source източник
comment
mozilla.org/rhino/tutorial.html#callingJSfuns   -  person jmj    schedule 22.10.2010
comment
@org Този пример не ми е много ясен. Къде да посоча пътя на JS файла? Предполагам, че предполага, че просто ще напиша целия JS код в cmdline и ще го предам като аргумент на моето java приложение! ^^   -  person instantsetsuna    schedule 22.10.2010


Отговори (1)


String script = "function abc(x,y) {return x+y;}";
Context context = Context.enter();
try {
    ScriptableObject scope = context.initStandardObjects();
    Scriptable that = context.newObject(scope);
    Function fct = context.compileFunction(scope, script, "script", 1, null);
    Object result = fct.call(
            context, scope, that, new Object[] {2, 3});
    System.out.println(Context.jsToJava(result, int.class));
} finally {
    Context.exit();
}

АКТУАЛИЗАЦИЯ: когато функцията е заредена в обхвата, заедно с други функции и променливи

String script = "function abc(x,y) {return x+y;}"
        + "function def(u,v) {return u-v;}";
Context context = Context.enter();
try {
    ScriptableObject scope = context.initStandardObjects();
    context.evaluateString(scope, script, "script", 1, null);
    Function fct = (Function)scope.get("abc", scope);
    Object result = fct.call(
            context, scope, scope, new Object[] {2, 3});
    System.out.println(Context.jsToJava(result, int.class));
} finally {
    Context.exit();
}
person Maurice Perry    schedule 22.10.2010
comment
Не забравяйте да добавите това, преди да опитате block context.setOptimizationLevel(-1); - person anshad; 06.04.2016
comment
@Maurice Perry, ако искам да извикам функция, използвайки многомерен масив от цели числа като [[1,3],[4,5],[6,9]], тогава как мога да предам Object[]? - person Samir Mangroliya; 11.08.2016
comment
@SamirMangroliya Предполагам, че ще трябва да извикате Context.newArray за всеки вътрешен масив и след това още веднъж за външния масив. - person Maurice Perry; 12.08.2016