• JSNI GWT中的东东


    二、JavaScript Native Interface
    JavaScript本地接口JSNI。
    1)声明一个本地方法
    在JSNI中声明一个本地方法时,使用Java的标准native关键字,就像在JNI(Java Native Interface)中一样。在JNI中,本地C代码是一个单独的文件,独立编译且在运行时动态加载。
    在JSNI中,本地JavaScript代码用一种特殊的注释格式直接嵌入到Java源代码中。
    JSNIProject/src/com/xyz/client/Alert.java
    --------------------------------------
    public class Alert{
      public static native void alert(String msg) /*-{
        $wnd.alert(msg);
        }-*/;
    }
    --------------------------------------
    JSNI注释块以“/*-{”开头,以“}-*/”结束。
    这个例子显示,当用JSNI访问浏览器窗口和文档对象时,必须分别用$wnd和$doc引用它们。在嵌套的框架中运行已编译的脚本时,$wnd和$doc会自动的初始化,用主机页窗口和文档来代替框架。
    2)它的工作机制
    在WEB模式中,GWT编译器把客户端一半的Java程序转换成JavaScript。
    正常情况,当编译器看到方法声明时,其括号内部的代码必须经历解释过程。如果方法是本地方法,编译器处理更为简单。它直接复制JavaScript本地代码到已编译的结果中。
    一旦JavaScript被解释后,JavaScript代码中的任何错误就只能在运行时才能发现。
    3)从Java中调用JSNI
    在Java中调用JSNI与调用其它Java方法没有什么不同。
    JSNIProject/src/com/xyz/client/LSNIExample.java
    --------------------------------------
    button1.addClickListener(new ClickListener(){
      public void onClick(Widget sender){
        Alert.alert("Clicked!");
      }
    });
    --------------------------------------
    4)从JSNI中调用Java
    假定你传递一个对象到JSNI方法,你需要访问一个字段或在对象中调用一个方法。你还需知道GWT编译器怎样弄糟Java域和方法名,因此你可以在JavaScript代码中访问它们。
    (1)访问Java域(field)
    访问Java域的语法如下:
    --------------------------------------
    obj.@class::field
    --------------------------------------
    obj 是引用对象的实例
    class 是具有full-qualified的类
    field 访问域的域名
    (2)调用Java方法
    调用Java方法的语法和访问Java域的语法相似,语法如下:
    --------------------------------------
    obj.@class::method(sig)(args)
    --------------------------------------
    method 调用方法的方法名
    sig 内部的Java方法签名
    args 方法传递的参数列表
    (3)方法签名(Method Signature)
    JSNI方法签名确切地说和JNI方法签名一样,除了方法返回类型有所不同。
    下面的表显示了这些方法签名
    --------------------------------------
    Type Signature        Java Type
    --------------------------------------
    Z                     boolean
    B                     byte
    C                     char
    S                     short
    I                     int
    J                     long
    F                     float
    D                     double
    [type                 type()
    Lfully-qualified-class;      fully-qualified-class
    --------------------------------------
    例如:Java方法:
    long f(int n, String s, int[] arr);
    有如下的类型签名:
    ILjava/lang/String;[I)
    (4)例子
    下面的代码显示了通过JSNI访问Java域和方法的例子。它说明了传递数字、字符串、布尔型和Java对象到JavaScript。它还显示了JavaScript方法怎样调用传递过来的Java对象。
    --------------------------------------
    Java类型           它是怎样出现在JavaScript代码中的
    a Java numeric primitive    var x=42;
    String             var s="my string";
    boolean            var b=true;
    JavaScriptObject   从JavaScript代码中初始化,典型的是作为其它JSNI方法的返回值
    Java Object        通过特殊语法得到的不透明的值
    --------------------------------------
    JSNIProject/src/com/xyz/client/j2js.java
    ----------------------------------------------------------
    public class J2JS{
      /** Pass a Java numeric primitive */
      public static void testJ2JSNumeric(){
        int x=42;
        jsNumeric(x);
      }
      privae static native void jsNumeric(int x)/*-{
        $wnd.alert("x is "+x);
      }-*/;
      /** Pass a Java String */
      public static void testJ2JSString(){
        String s="my string";
        jsString(s);
      }
      private static native void jsString(String s) /*-{
        $wnd.alert("s is "+s);
      }-*/;
      /** Pass a boolean */
      public static void testJ2JSBoolean(){
        boolean b=true;
        jsBoolean(b);
      }
      private static native void jsBoolean(boolean b) /*-{
        $wnd.alert("b is "+b);
      }-*/;
      /** Pass an arbitrary Java Object */
      public static void testJ2JSObject(){
        MyJavaObject obj=new MyJavaObject();
        jsObject(obj);
      }
      private static native void jsObject(MyJavaObject obj) /*-{
        $wnd.alert("Calling getText():"+obj.@MyJavaObject::getTextAt(I)(3));
      }-*/;
    }
    ----------------------------------------------------------
    如果你看GWT的源码时,可以看到许多安装JSNI定义的东东。大多数GWT编程者不需要定义JSNI方法,但还是该留意它,或许用得上

  • 相关阅读:
    1-hadoop中遇到的各种异常
    13-hadoop-入门程序
    12-mapReduce的简介和yarn搭建
    11-hdfs-NameNode-HA-wtihQJM解决单点故障问题
    10-hdfs-hdfs搭建
    redis-java-api
    深度学习优化方法
    tf.nn.embedding_lookup()
    tf.variable_scope()和tf.name_scope()
    tf.Variable()、tf.get_variable()和tf.placeholder()
  • 原文地址:https://www.cnblogs.com/zhwl/p/3565990.html
Copyright © 2020-2023  润新知