Domanda

Ho un metodo JSNI che chiama un metodo Java che accetta un Hasmap come input. Ho provato

handler.@com.mypackage::myMethod(Ljava/util/Hashmap;)(myHashMap);
handler.@com.mypackage::myMethod(Ljava/util/Hashmap<Ljava/lang/String,Ljava/lang/String>;)(myHashMap);

Non riesco a definire la firma del tipo corretto per includere le stringhe o scoprire se questo utilizzo è consentito.

Dal momento che lo sto facendo in GTW, ho pensato che potesse essere l'implementazione di hashmap e l'approccio alternativo che ho comunque preso come array String [] [] come input

Speravo in qualcosa di simile

handler @ com.mypackage :: myMethod ([[Ljava / lang / String;). (MyArray);

Tuttavia, ho riscontrato un altro problema relativo alla ricerca dello sntax JNSI corretto per la seconda dimensione dell'array

Un array a dimensione singola, ad es. [Ljava/lang/String; va bene ma ho bisogno della seconda dimensione.

Qualsiasi aiuto / idea o collegamento a un buon documento jnsi apprezzato.

È stato utile?

Soluzione

Puoi pubblicare l'errore che stai ottenendo e anche quale tipo di oggetto JavaScript stai provando a passare come hashmap. Suppongo che stai ricevendo un errore di compilazione?

Ecco un buon inizio per la documentazione JSNI:

GWT JSNI doc

Post sul blog GWT su JSNI

Altri suggerimenti

Penso che ti stai imbattendo nella cancellazione del tipo. Ogni parametro generico dell'oggetto è in realtà solo java.lang.Object in fase di esecuzione. Non credo che i generici siano esposti a JNI.

Ho scritto codice JNI ma non ho mai provato a usare tipi generici da codice nativo, quindi non ne sono sicuro. Google non ha trovato riferimenti o esempi specifici.

Vedi Firme del tipo di macchina virtuale Java per un riferimento alle firme dei tipi utilizzate in JNI (e JSNI)

Tuttavia, potrebbe non essere necessario passare comunque una HashMap Java a Javascript. Invece, considera l'utilizzo di JSONObject e il passaggio di un oggetto JavaScript nativo al tuo codice javascript. Sembra così:

  public void callFoo() {
    JSONObject obj = new JSONObject();
    obj.put("propertyName", new JSONString("properyValue"));
    JavaScriptObject jsObj = obj.getJavaScriptObject();

    nativeFoo(jsObj);
  }

  public native void nativeFoo(JavaScriptObject obj) /*-{
    $wnd.alert(obj['propertyName']);
  }-*/;

Questo viene compilato in modo approssimativo:

var obj = {'propertyName': 'propertyValue'};
$wnd.alert(obj['propertyName']);

Ok, dopo averlo visto ...

Non sono stato in grado di trovare alcuna documentazione o disposizione che fornisca l'array multidimensionale di stringhe. Gestito per farlo usando HashMap, usando:

handler.@com.mypackage::myMethod(Ljava/util/Hashmap;)(myHashMap);

ha funzionato se definivo l'input senza definire i tipi. Come ad esempio:

HashMap myHashMap = new HashMap();

Questo dà a JSNI una HashMap di tipo <Object, Object>.

Sto quindi gestendo l'oggetto dall'altra parte lanciando il contenuto dell'hashmap in stringhe.

Grazie a Rusty per i collegamenti:

GWT JSNI doc - Questo è utile per ottenere la formattazione corretta delle primitive

Post sul blog GWT su JSNI - Non avevo mai visto questo blog prima

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top