JSNI - 从 JS 函数调用 Java 方法

发布于 2024-11-19 07:56:56 字数 363 浏览 10 评论 0原文

我试图直接从 JSNI 函数调用 java 方法,但由于某种原因它永远无法工作。我在这里做错了什么? :(

这是我的代码

/**
   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);}

感谢所有有用的评论

I am trying to invoke a java method right from my JSNI function but for some reason it never works. What am I doing wrong here? :(

Here is my code

/**
   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);}

All useful comments are appreciated

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

友欢 2024-11-26 07:56:56

您需要在 function 块之外引用 this

/**
 * 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);
}

You need to take a reference to this outside the function block:

/**
 * 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);
}
信愁 2024-11-26 07:56:56

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

(function b(p)
{
 this.@com.(...).TestClass::setTest(Ljava/lang/String;)(p);

})(param);

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

private native void test(String param)

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

private native void test(String param)
/*-{    
var a = this.@com.(...).TestClass::setTest(Ljava/lang/String;)(param);    
}-*/

顺便说一句,拥有一个其唯一目的是调用另一个函数的函数是一种代码味道。

Your usage of the this keyword may cause the problem. In your context the this keywords points to the closure

(function b(p)
{
 this.@com.(...).TestClass::setTest(Ljava/lang/String;)(p);

})(param);

Ideally it should point to the function that GWT compiles from

private native void test(String param)

this statement.

Try using this code segment (I'm not sure if I got the syntax right, verify with GWT JSNI wiki) :

private native void test(String param)
/*-{    
var a = this.@com.(...).TestClass::setTest(Ljava/lang/String;)(param);    
}-*/

BTW, Having a function whose sole purpose is to call another function is a code smell.

浪菊怪哟 2024-11-26 07:56:56

是的,正如 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);
} 

Yes, as Zasz is pointing out, you are overcomplicating your code (expect if you really want to provide a JavaScript method, but in that case you have to do it in a complete different way...)

So I tested the code and this works:

/*    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);
} 
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文