Eliran Malka的答案是一个不错的起点。但请注意,有一种更高效的扩展解决方案适用于某些情况。这就是为什么我创建另一个答案的原因。
简单的解决方案如下:
public static JsArrayString toJsArray(String[] input) {
JsArrayString jsArrayString = JsArrayString.createArray().cast();
for (String s : input) {
jsArrayString.push(s);
}
return jsArrayString;
}
更高效的解决方案需要一些背景知识...
GWT编译器在Java代码使用Java数组时使用JS数组。所以在这种情况下,您已经有了一个JS数组。但是这可能会导致副作用,在Dev和Prod模式下产生不同的行为:
由于在Dev模式下我们有真正的Java数组,因此始终需要通过复制值将其转换为JS数组。对其中一个数组的操作对另一个数组不可见。
在Prod模式下,如果我们直接使用Java数组作为JS数组,那么我们只会有一个数组。因此,无论是Java代码还是JS代码中的操纵都会影响其他世界。
但是,如果您的用例符合以下条件,则可以在不创建另一个数组的情况下使用该数组:
- 以下其中之一必须为真
- JS代码根本没有操作数组
- 在将数组传递给JSNI方法后,Java代码不再使用该数组
- 以下其中之一必须为真
- JS代码仅在其中使用一次该数组(JS代码不会创建超出本机方法调用的数组引用)
- Native调用后,Java代码不操纵该数组。
在这种情况下,您将没有副作用(Dev和Prod模式下的不同行为),并且可以直接在本机代码中使用该数组。
这种实现包含在GWT的JsArrayUtils中。但是,很遗憾目前没有String数组的实现。但是实现将如下所示:
public static JsArrayString readOnlyJsArray(String[] array) {
if (GWT.isScript()) {
return arrayAsJsArrayForProdMode(array).cast();
}
JsArrayString dest = JsArrayString.createArray().cast();
for (int i = 0; i < array.length; ++i) {
dest.push(array[i]);
}
return dest;
}
private static native JavaScriptObject arrayAsJsArrayForProdMode(Object array) ;