我试图直接从我的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);}
赞赏所有有用的评论
答案 0 :(得分:2)
您需要在this
区块之外引用function
:
/**
* 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);
}
答案 1 :(得分: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);
}-*/
顺便说一句,拥有一个唯一目的是调用另一个函数的函数就是代码气味。
答案 2 :(得分: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);
}