0

我正在尝试直接从我的 JSNI 函数调用 java 方法,但由于某种原因它永远无法工作。我在这里做错了什么?:(

这是我的代码

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

var a=(function b(p)
{
 this.@com.(...).TestClass::setTest(Ljava/lang/String;)(p);

})(param);

}-*/

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

感谢所有有用的评论

4

3 回答 3

2

您需要参考块thisfunction

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

private void setTest(String param){
    Window.alert(param);
}
于 2012-05-02T02:21:29.123 回答
1

您对 this 关键字的使用可能会导致问题。在您的上下文中,this关键字指向闭包

(function b(p)
{
 this.@com.(...).TestClass::setTest(Ljava/lang/String;)(p);

})(param);

理想情况下,它应该指向 GWT 编译的函数

private native void test(String param)

这个说法。

尝试使用此代码段(我不确定我的语法是否正确,请使用 GWT JSNI wiki 验证):

private native void test(String param)
/*-{    
var a = this.@com.(...).TestClass::setTest(Ljava/lang/String;)(param);    
}-*/

顺便说一句,拥有一个唯一目的是调用另一个函数的函数是代码异味。

于 2011-07-12T05:06:42.433 回答
0

是的,正如 Zasz 指出的那样,您的代码过于复杂(如果您真的想提供 JavaScript 方法,但在这种情况下,您必须以完全不同的方式来做......)

所以我测试了代码,这有效:

/*    JNI Example method... */
private native void test(String param) /*-{  
    this.@com.stefank.client._53_JavaScriptOverlayTypes::setTest(Ljava/lang/String;)(param); 
}-*/;

private void setTest(String param){
    Window.alert(param);
} 
于 2011-07-12T07:16:10.567 回答