Pregunta

Tengo un método JSNI que llama a un método Java que toma un Hasmap como entrada. Lo he intentado

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

Parece que no puedo definir la firma de tipo correcta para incluir las cadenas o encontrar si este uso está permitido.

Como estoy haciendo esto en gwt, pensé que podría ser la implementación de hashmap y el enfoque alternativo que creí que toma una matriz String [] [] como entrada

Esperaba algo como

controlador. @ com.mypackage :: myMethod ([[Ljava / lang / String;) (myArray);

Sin embargo, me encontré con otro problema al encontrar la sintaxis JNSI correcta para la segunda dimensión de la matriz

Una matriz de una sola dimensión, es decir. [Ljava/lang/String; está bien pero necesito la segunda dimensión.

Cualquier ayuda / ideas o enlaces a buen jnsi doc apreciados.

¿Fue útil?

Solución

¿Puede publicar el error que está recibiendo, y también qué tipo de objeto javascript está tratando de pasar como un hashmap? ¿Asumo que está recibiendo un error de tiempo de compilación?

Aquí hay un buen comienzo para la documentación de JSNI:

GWT JSNI doc

Publicación en el blog de GWT en JSNI

Otros consejos

Creo que te encuentras con borrado de tipo. Cada parámetro de objeto genérico es realmente solo java.lang.Object en tiempo de ejecución. No creo que los genéricos estén expuestos a JNI.

He escrito código JNI pero nunca intenté usar tipos genéricos del código nativo, así que no estoy seguro. Google no ha encontrado referencias o ejemplos específicos.

Consulte Firmas de tipo Java VM para una referencia a las firmas de tipo utilizadas en JNI (y JSNI)

Sin embargo, es posible que no necesite pasar un Java HashMap a Javascript de todos modos. En cambio, considere usar JSONObject y pasar un objeto JavaScript nativo a su código javascript. Se ve así:

  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']);
  }-*/;

Esto se compila aproximadamente:

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

Ok, después de mirarlo ...

No pude encontrar ninguna documentación o arreglo que proporcione la matriz multidimensional de cadenas. Logramos hacer esto usando el HashMap, usando:

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

funcionó si defino la entrada sin definir los tipos. Tales como:

HashMap myHashMap = new HashMap();

Esto le da al JSNI un HashMap de tipo <Object, Object>.

Luego estoy manejando el objeto en el otro lado al convertir el contenido del hashmap en cadenas.

Gracias a rusty por los enlaces:

GWT JSNI doc - Esto es bueno para obtener el formato correcto de primitivas

Publicación en el blog de GWT en JSNI - No había visto este blog antes

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top