首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >JSNI -从JS函数调用Java方法

问JSNI -从JS函数调用Java方法
EN

Stack Overflow用户
提问于 2011-07-12 10:10:40
回答 3查看 3K关注 0票数 0

我正试图从我的JSNI函数中调用一个java方法,但由于某种原因,它永远不会工作。我到底做错了什么?

以下是我的代码

代码语言:javascript
复制
/**
   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);}

感谢所有有用的评论。

EN

回答 3

Stack Overflow用户

发布于 2012-05-02 10:21:29

您需要在function块之外引用this:

代码语言:javascript
复制
/**
 * 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);
}
票数 2
EN

Stack Overflow用户

发布于 2011-07-12 13:06:42

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

代码语言:javascript
复制
(function b(p)
{
 this.@com.(...).TestClass::setTest(Ljava/lang/String;)(p);

})(param);

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

代码语言:javascript
复制
private native void test(String param)

这句话。

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

代码语言:javascript
复制
private native void test(String param)
/*-{    
var a = this.@com.(...).TestClass::setTest(Ljava/lang/String;)(param);    
}-*/

顺便说一句,一个函数的唯一目的是调用另一个函数,这就是代码气味。

票数 1
EN

Stack Overflow用户

发布于 2011-07-12 15:16:11

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

所以我测试了代码,这是可行的:

代码语言: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);
} 
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6658800

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档