2010-10-22 2 views
12

Я использую Mozilla Rhino 1.7r2 (а не версию JDK), и я хочу вызвать JS-функцию из Java.Rhino: Как вызвать функцию JS из Java

функция My JS как это:

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

Как мне это сделать?

Edit: (Функция JS находится в отдельном файле)

+0

Http: // www.mozilla.org/rhino/tutorial.html#callingJSfuns –

+0

@org Этот пример мне не очень понятен. Где указать путь к файлу JS? Я предполагаю, что предполагается, что я просто набрал весь JS-код в cmdline и передал бы его в качестве аргумента для моего java-приложения! ^^ " – instantsetsuna

ответ

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

UPDATE: когда функция загружается в область, наряду с другими функциями и переменными

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(); 
} 
+0

Работает отлично! Спасибо! :) Вот полный код http://pastie.org/1240495 – instantsetsuna

+1

Не забудьте добавить это перед тем, как попробовать блок context.setOptimizationLevel (-1); – anshad

+0

@Maurice Perry if Я хочу вызвать функцию с помощью многомерного целочисленного массива, например [[1,3], [4,5], [6,9]], то как я могу передать Object []? –

Смежные вопросы