您將需要將您想調用的任何方法從javascript導出到javascript全局範圍中。這意味着你不能從手寫javascript調用任意的java方法。您必須提前計劃並在javascript範圍內公開必要的方法。
過程是非常簡單的:
- 編寫創建於$ WND範圍功能的JSNI方法。
- 從這個函數的主體調用java方法使用JSNI JavaScript to java syntax。
- 在應用程序啓動期間調用步驟#1中聲明的方法(例如,從入門點onmoduleload)
- 調用在$ wnd作用域中創建的函數從您的javascript。確保在加載gwt模塊並運行入口點後執行此操作。
從GWT JSNI documentation與附加註釋的例子:
package mypackage;
public MyUtilityClass
{
//Method to be called from javascript, could be in any other class too
public static int computeLoanInterest(int amt, float interestRate,
int term) { ... }
//This method should be called during application startup
public static native void exportStaticMethod() /*-{
//the function named here will become available in javascript scope
$wnd.computeLoanInterest =
$entry(@mypackage.MyUtilityClass::computeLoanInterest(IFI));
}-*/;
}
編輯:
將參數傳遞給Java方法:
當你調用Java方法需要參數ERS,從JavaScript,你需要使用一個特定的語法:
[instance-expr.]@class-name::method-name(param-signature)(arguments)
例如,調用,需要一個字符串參數的靜態方法是這樣的:
@com.google.gwt.examples.JSNIExample::staticFoo(Ljava/lang/String;)(s);
需要注意的是,我們在呼喚一個靜態方法,'實例表達式'。被省略。其餘代碼是完全合格的類名稱,後跟::
和方法名稱。方法名稱後面的Ljava/lang/String;
指定我們需要調用以String對象爲參數的方法。最後s
是該參數的實際值。
請記住,在我們的例子中,參數簽名Ljava/lang/String;
在語法上使用JNI type signature specs,並且GWT編譯器要求選擇正確的方法,即使存在多個具有相同名稱的重載方法。即使方法沒有過載,也需要param-signature
。
我的gwt應用程序現在可以接收來自硬寫javascript的事件,但這是空參數。我需要將String傳遞給gwt函數作爲它的參數,但是我不能在@entry中做到這一點,關於如何實現這一點的任何想法? – xybrek
@xybrek查看更新的答案 –