我创建了一个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");
}-*/;
}
非常感谢任何帮助。
答案 0 :(得分:1)
如果查看differences between GWT & Vaadin,您会注意到除了cliend-side API之外,Vaadin还有一个服务器端API,您发布的代码属于该类别。正在搜索Vadin论坛,我发现了this question您遇到的确切问题。加上来自Vaadin开发团队的Henry Sara的回复:
JSNI仅在客户端小部件中可用,而您正在工作 在服务器端。
使用Window.executeJavaScript(“...”)(Vaadin 6)或 Root.executeJavaScript(“...”)(Vaadin 7),如果你需要执行 来自服务器端应用程序的JavaScript。
虽然自答案后事情可能已发生变化,Root.executeJavaScript("...");
现在可能JavaScript.getCurrent().execute(...)");
,但Vaadin文档提供有关javascript interactions to and from the serverside以及js components and extensions以及您的信息可以查看wiki以获取更多示例。