2010-10-22 43 views
12

Tôi đang sử dụng Mozilla Rhino 1.7r2 (không phải là phiên bản JDK) và tôi muốn gọi hàm JS từ Java.Tê giác: Cách gọi hàm JS từ Java

My JS chức năng là như thế này:

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

Làm thế nào để làm điều này?

Edit: (Chức năng JS là trong một tệp riêng)

+0

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

+0

@org Ví dụ đó không rõ ràng đối với tôi. Tôi chỉ định đường dẫn của tệp JS ở đâu? Tôi đoán nó giả định rằng tôi chỉ cần gõ toàn bộ mã JS trong cmdline và chuyển nó như là một arg cho ứng dụng java của tôi! ^^ " – instantsetsuna

Trả lời

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: khi hàm được nạp trong phạm vi, cùng với các chức năng khác và các biến

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

Hoạt động hoàn hảo! Cảm ơn bạn! :) Đây là mã đầy đủ http://pastie.org/1240495 – instantsetsuna

+1

Đừng quên thêm điều này trước khi thử chặn context.setOptimizationLevel (-1); – anshad

+0

@Maurice Perry nếu tôi muốn gọi hàm bằng cách sử dụng mảng nguyên bội nhiều chiều như [[1,3], [4,5], [6,9]] sau đó làm thế nào tôi có thể vượt qua Object []? –

Các vấn đề liên quan