簡體   English   中英

如何在GWT JSNI中將返回值從JavaScript轉換為Java?

[英]How to cast a return value from javascript to java in GWT JSNI?

JSNI方法不接受任何參數,但返回Java Object類型:

 public static native String nativeJSFuncGwt() /*-{
        $wnd.console.log($wnd.someJSFunc());
        return "" + $wnd.someJSFunc() + "" ;
    }-*/;


//someJSFunc returns { abc:xcv, def:asd}

我可以看到該值已在javascript控制台中打印出來,但Java方面無法理解轉換。

是否因為本機方法不接受任何參數?

String tokenFromNativeJS = nativeJSFuncGwt(); // String value is null 

GWT中的文檔也不夠清楚。

第一步,避免使用JSNI,最好定義一個提供相同API訪問權限的JsInterop方法。 JSNI仍然可以在GWT2中使用,但是JsInterop是GWT3的前進之路,並且通常更容易讀寫。 看起來像這樣:

@JsMethod(name = "someJSFunc", namespace = JsPackage.GLOBAL)
public static native String someJSFunc();

第二步,定義一個適合您期望的JS返回值的Java類型。 這將與JSNI或JsInterop一起使用。 在JSNI中,您將創建一個JavaScriptObject子類,並提供訪問字段的方法(有關更多詳細信息,請參見http://www.gwtproject.org/doc/latest/DevGuideCodingBasicsJSNI.html和其他文檔,但是按照第一步,我將我不會在這里對此進行更深入的探討)。 對於您的示例對象,在JsInterop中看起來像這樣:

@JsType(isNative = true, name = "Object", namespace = JsPackage.GLOBAL)
public class SomeReturnObject {
    public String abc;
    public double def;
}

顯然,用您自己項目中合適的名稱替換字段名稱和類型。 給此新類型加上占位符名稱,這就是您的全局someJsFunc的外觀:

@JsMethod(name = "someJSFunc", namespace = JsPackage.GLOBAL)
public static native SomeReturnObject someJSFunc();

您將像使用純Java一樣使用它-不再需要編寫JSNI了:

SomeReturnObject object = someJSFunc();
DomGlobal.console.log(object.abc + ": " + object.def);

我在這里發布了由於GWT版本(2.4)約束而最終成功的結果

從GWT Doc:

外發Java類型:

任何其他Java對象(包括數組)

必須通過什么:

必須源自Java代碼的正確類型的Java對象; Java對象無法從JavaScript中“稀薄地”構造

我的修改后的代碼想要:

public static native MyObject nativeJSFuncGwt(MyObject obj) /*-{

   var xyz = $wnd.someJsFunc();

   obj.@package.name::setter1(Ljava/lang/String;)(xyz);

   return obj;

 }-*/;

我希望文檔可以更加清晰。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM