2011-07-12 46 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); 
}