Java 我的GWT应用程序不是';t在JSNI调用之外运行本机函数。有人要吗?

Java 我的GWT应用程序不是';t在JSNI调用之外运行本机函数。有人要吗?,java,gwt,jsni,Java,Gwt,Jsni,我试图在GWT应用程序中通过JSNI调用运行本机Java函数。它看起来像这样: 包foo.client 公共类AAA实现入口点、UIupdate{ public native void initChangeFunc() /*-{ $wnd.jsChangeView = function () { this.@foo.client.AAA::changeToHistory(); alert("got here"); }; }-*/; public

我试图在GWT应用程序中通过JSNI调用运行本机Java函数。它看起来像这样:

包foo.client

公共类AAA实现入口点、UIupdate{

public native void initChangeFunc() /*-{
    $wnd.jsChangeView = function () {

        this.@foo.client.AAA::changeToHistory();
        alert("got here");
    };
}-*/;
public void changeToHistory() {
    Window.alert("Hello World");
    //Change view here.
    this.changeView("history");
    this.changeHistoryView("bydate");
};

}


将jsChangeView()函数调用附加到前端的link onclick()并单击它会导致“Get here”警报,而不是“Hello World”警报,另外两个函数也没有运行。GWT不是我的专业领域,这也不是我的应用程序,所以我知道我缺少一些基本的东西。任何接受者?

这。@foo.client.AAA::changeToHistory()
仅引用该方法(如果您愿意,是“函数指针”,或者在JavaScript中只是“函数”),而不调用它。您必须编写
这个@foo.client.AAA::changeToHistory()()
才能真正进行调用


当方法有参数时,这一点更为明显,例如:
this.@foo.client.AAA::changeToHistory(Ljava/lang/String;I)
vs也一样。有点正常,除了我的Firefox错误控制台现在抱怨“this.changeToHistory不是一个函数”。我假设它试图将其作为本地javascript函数引用。我想我也可以把它声明为一个本机函数,但是当我试图调用内部函数时,我又回到了原点;您的“this”将取决于调用函数的上下文;很可能是
$wnd
。一种常见的模式是将
this
分配给一个变量,并从匿名函数中引用该变量:
var that=this$jsChangeView=$entry(函数(){that….;})
(根据Jason Hall的建议,还添加了
$entry
,它将运行您的
GWT。如果
changeToHistory
中出现错误,UncaughtExceptionHandler
)找到了$entry解决方案。其他问题比比皆是,但这都是Java方面的问题。非常感谢你,你是我的救星。
public void onModuleLoad() {
    this.initChangeFunc();
}