这是参考这个例子:
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)
显示类型不匹配错误
由于 拉维
答案 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并没有增加太多价值:)。