2010-10-22 14 views
12

J'utilise Mozilla Rhino 1.7r2 (pas la version JDK), et je veux appeler une fonction JS de Java.Rhino: comment appeler la fonction JS à partir de Java

fonction My JS est comme ceci:

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

Comment puis-je faire?

Edit: (La fonction JS est dans un fichier séparé)

+0

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

+0

@org Cet exemple n'est pas très clair pour moi. Où dois-je spécifier le chemin du fichier JS? Je suppose que cela suppose que je vais simplement taper le code JS entier dans cmdline et le passer comme argument à mon application java! ^^ " – instantsetsuna

Répondre

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: lorsque la fonction est chargé dans le champ d'application, ainsi que d'autres fonctions et variables

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

Fonctionne parfaitement! Merci! :) Voici le code complet http://pastie.org/1240495 – instantsetsuna

+1

N'oubliez pas d'ajouter ceci avant d'essayer de bloquer context.setOptimizationLevel (-1); – anshad

+0

@Maurice Perry si Je veux appeler la fonction en utilisant un tableau d'entiers multidimensionnels comme [[1,3], [4,5], [6,9]] alors comment puis-je passer Object []? –