1

我创建了一个 Vaadin 项目,并使用 JSNI 编写脚本。但是当执行到 JSNI 脚本时,它会显示错误。

java.lang.UnsatisfiedLinkError: com.yty.cws.CiwsUI.jsniDemo()V
    at com.yty.cws.CiwsUI.jsniDemo(Native Method) ~[classes/:na]
    at com.yty.cws.CiwsUI.lambda$0(CwsUI.java:31) ~[classes/:na]
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:1.8.0_92]
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[na:1.8.0_92]

以下是我的示例代码。

public class CiwsUI extends UI{

    private static final long serialVersionUID = 5275145103992848572L;
    VerticalLayout mainLayout=new VerticalLayout();
    private TextField txtName=new TextField();
    private Button btnJSNI=new Button("JSNI");
    @Override
    protected void init(VaadinRequest request) {

        mainLayout.addComponents(txtName,btnJSNI);
        setContent(mainLayout);
        mainLayout.setComponentAlignment(txtName, Alignment.MIDDLE_CENTER);
        mainLayout.setComponentAlignment(btnJSNI, Alignment.MIDDLE_CENTER);
        btnJSNI.addClickListener(e->{
            System.out.println("Clicked");
            jsniDemo();
        });
    }
    private native void jsniDemo()/*-{
    $wnd.alert("Hai JSNI");
    }-*/;

}

任何帮助是极大的赞赏。

4

1 回答 1

1

如果您查看GWT 和 Vaadin 之间的差异,您会注意到除了客户端 API 之外,Vaadin 还有一个服务器端 API,您发布的代码属于该类别。搜索 Vaadin 论坛,我发现这个问题与您的确切问题有关。在下面添加来自 Vaadin 开发团队的 Henry Sara 的回复:

JSNI 只能在客户端小部件中使用,而您在服务器端工作。

如果您需要从服务器端应用程序执行 JavaScript,请使用 Window.executeJavaScript("...") (Vaadin 6) 或 Root.executeJavaScript("...") (Vaadin 7)。

虽然自答案以来事情可能已经发生了变化,Root.executeJavaScript("...");现在可能是JavaScript.getCurrent().execute(...)");,Vaadin 文档提供了有关与服务器端之间的 javascript 交互以及js 组件和扩展的信息,您还可以查看wiki以获取更多示例。

于 2016-07-21T08:47:42.180 回答