2011-07-12 82 views
0

我想從我的JSNI函數調用一個java方法,但由於某種原因它永遠不會工作。我在這裏做錯了什麼? :(JSNI - 從JS函數調用Java方法

這裏是我的代碼

/** 
    For UI button click method... 
*/ 
private native void test(String param) 
/*-{ 

var a=(function b(p) 
{ 
[email protected](...).TestClass::setTest(Ljava/lang/String;)(p); 

})(param); 

}-*/ 

private void setTest(String param){Window.alert(param);} 

所有有用的意見表示讚賞

回答

1

你this關鍵字的使用可能會導致問題。在你的背景下,this關鍵字指向封閉

(function b(p) 
{ 
[email protected](...).TestClass::setTest(Ljava/lang/String;)(p); 

})(param); 

理想情況下,它應該指向GWT編譯的功能

private native void test(String param) 

此聲明。

嘗試使用此代碼段(我不知道如果我的語法正確,與GWT JSNI維基驗證):

private native void test(String param) 
/*-{  
var a = [email protected](...).TestClass::setTest(Ljava/lang/String;)(param);  
}-*/ 

BTW,有其唯一目的是調用另一個功能是一種功能代碼味道。

+0

電解金屬錳我用「THI s「,因爲所有的方法都在同一個類中。我沒有得到編譯錯誤,但Java方法invokation只適用於JS功能塊:(也許我做了一些錯誤的invokation然後?幫我理解請 – user592704

+0

我試着使用本地方法,而不是這樣: – user592704

+0

問題是THIS指針指向一個不同的匿名類(或原型),如果你在一個功能塊中使用它。爲了從javascript調用GWT函數,THIS關鍵字應該指向由GWT生成的類,如果它太混亂嘗試刪除THIS關鍵字/限定符 – Zasz

0

是的,蟲Zasz時指出,你是過於複雜的代碼(期望,如果你真的想提供一個JavaScript方法,但在這種情況下,你必須做一個完全不同的方式...)

所以我測試的代碼,這個工程:

/* JNI Example method... */ 
private native void test(String param) /*-{ 
    [email protected]_53_JavaScriptOverlayTypes::setTest(Ljava/lang/String;)(param); 
}-*/; 

private void setTest(String param){ 
    Window.alert(param); 
} 
+0

這是greate,但我需要從JS功能塊調用Java方法,這是我猜的問題:(是否有一個最佳的方式來做到這一點? – user592704

2

你需要採取一個參考thisfunction塊之外:

/** 
* For UI button click method... 
*/ 
private native void test(String param) /*-{ 
    var theInstance = this; 
    var a = (function b(p) { 
     [email protected](...).TestClass::setTest(Ljava/lang/String;)(p); 
    })(param); 
}-*/; 

private void setTest(String param){ 
    Window.alert(param); 
}