gwt从手写javascript调用java函数

时间:2013-12-17 20:48:34

标签: javascript gwt

这是参考这个例子:

package mypackage;

public MyUtilityClass
{
    public static int computeLoanInterest(int amt, float interestRate,
                                      int term) { ... }
    public static native void exportStaticMethod() /*-{
      $wnd.computeLoanInterest =
      $entry(@mypackage.MyUtilityClass::computeLoanInterest(IFI));
    }-*/;
}

我需要知道调用此函数的javascript代码。如果我使用<input type="button" onclick=computeLoanInterest(1,2.1,1)/>示例有效,但var x = computeLoanInterest(1,2.1,1) does not work。有人能告诉我这里我错过了什么。

var x = computeLoanInterest(1,2.1,1);使x未定义的值 var x = window.computeLoanInterest(1,2.1,1)显示类型不匹配错误

由于 拉维

1 个答案:

答案 0 :(得分:2)

最简单的解决方案就是摆脱$ entry wrapper。只需写入您的JSNI导出方法:

public static native void exportStaticMethod() /*-{
    $wnd.computeLoanInterest = @mypackage.MyUtilityClass::computeLoanInterest(IFI);
}-*/;

为什么这样? $ entry函数在com.google.gwt.core.client.impl.Impl中定义 它看起来像(我删除了评论):

public static native JavaScriptObject entry(JavaScriptObject jsFunction) /*-{
    return function() {
        try {
            return @com.google.gwt.core.client.impl.Impl::entry0(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)(jsFunction, this, arguments);
        } catch (e) {
            throw e;
        }
    };
}-*/;

这没什么特别可疑的,它只是用一些其他函数包装你的函数但是...参见entry0方法签名:

private static Object entry0(Object jsFunction, Object thisObj,
    Object arguments) throws Throwable 

它返回Object - 这可能是你遇到类型不匹配错误的原因。 正如您所看到的那样,调用$ entry并没有增加太多价值:)。