GWT JavaScript Native Interface (JSNI)

2024 年 8 月 29 日 | 阅读 3 分钟

GWT JSNI 用于解决诸如将 GWT 与现有的手写 JavaScript 或第三方 JavaScript 库集成在一起的问题。有时,我们需要访问 GWT 类 API 没有公开的底层浏览器功能。

JSNI 相当于内联汇编代码,可以用于多种方式,例如

  • 直接在 JavaScript 中实现 Java 方法。
  • 在现有 JavaScript 周围封装类型安全的 Java 方法签名。
  • 从 JavaScript 代码调用 Java 代码,反之亦然。
  • 跨 Java/JavaScript 边界抛出异常。
  • 从 JavaScript 读取和写入 Java 字段。
  • 使用开发模式调试 Java 源代码(使用 Java 调试器)和 JavaScript(使用脚本调试器)。

声明原生方法

语法

从 Java 调用 JSNI

从 Java 调用 JSNI 方法与调用常规 Java 方法没有什么不同。

示例

调用者实际上无法判断该方法是否是原生的。这为改变方法的实现方式提供了一些灵活性。

从 JSNI 调用 Java

这比从 Java 调用 JSNI 更复杂。例如,假设我们向 JSNI 方法传递一个对象,并且需要访问该对象中的字段或调用方法。我们需要知道 GWT 编译器如何管理 Java 字段和方法名称。这有助于从您自己的 JavaScript 代码访问字段。

访问 Java 字段

语法

其中:

obj:它是被引用的对象实例。对于静态变量,省略实例表达式和尾随句点。
class:这是声明字段的类的完全限定名称(或其子类)。
field:这是被访问的字段的名称。

调用 Java 方法

调用方法使用类似于访问字段的语法,但也要提供方法调用的签名。Java 方法可以被重载,即两个方法可以具有相同的名称,但接受不同的参数。

语法

其中:

obj:它是被引用的对象实例。对于静态方法,省略实例表达式和尾随句点。
class: 在该方法中声明(或其子类)。
method:这是被调用的方法的名称。

GWT JSNI 方法签名

JSNI 方法签名与 JNI 方法签名完全相同,只是省略了方法返回类型。下表显示了类型签名


类型签名Java 类型
ZBoolean
BByte
C字符
SShort
Iint
JLong
FFloat
DDouble

GWT JSNI 示例

它演示了将数字、字符串、布尔值和 Java 对象传递给 JavaScript。它还显示了 JavaScript 方法如何对传入的 Java 对象进行方法调用。

下表包含 JSNI 代码中的数据类型和类型表示形式。
Java 类型JavaScript 代码显示
Java 数值JavaScript 数值,int var x= 5。
StringJavaScript 字符串值 var x="JavaTpoint"。
BooleanJavaScript 布尔值 var x= true。
JavaScript 对象JavaScript 对象,它必须源自 JavaScript 代码。它应该是其他 JSNI 方法的返回值。
Java 数组一个不透明值,只能传递回 Java 代码。
Java 对象一个不透明值,可以通过特殊语法访问。
下一主题#