2017-07-11 4 views
0

J'ai une méthode dans ma bibliothèque java qui obtient une carte comme une entrée.
ici est ma méthode javacréer java hashmap avec Unity AndroidJavaObject

public void myMethod(Map<String, String> map){ 
    //do some thing with this map 
} 

Et mon code C# dans l'unité

AndroidJavaObject javaMap= new AndroidJavaObject("java.util.HashMap"); 
javaMap.Call("put", "key1", "value1"); 
AndroidJavaClass javaClass = new AndroidJavaClass("com.alirezaahmadi.android.sdk.core.BaseAPI"); 
javaClass.CallStatic("myMethod", javaMap); 

Je peux essayer un peu de code comme ça, mais la carte est une classe générique et ce code ne fonctionne pas

quand je lance ce que je reçois cette erreur

AndroidJavaException: java.lang.NoSuchMethodError: no non-static method with name='put' signature='(Ljava/lang/String;Ljava/lang/String;)V' in class Ljava.lang.Object; 
java.lang.NoSuchMethodError: no non-static method with name='put' signature='(Ljava/lang/String;Ljava/lang/String;)V' in class Ljava.lang.Object; 

Comment est-ce que je peux réparer ceci et placer une hashmap java dans cette méthode. BTW Je ne peux pas changer le code Java.

+0

Ne pensez-vous il serait utile de poster aussi votre code Java pour que nous puissions voir la méthode 'myMethod'? Peut-être nous dire quelle ligne du C# provoque l'erreur. Avec ce que vous avez maintenant, il n'y a aucun moyen de comprendre votre problème. – Programmer

+0

En plus de la méthode "myMethod", AndroidJavaObject.Call() prend une méthode comme première entrée, ce qui dans votre cas serait "put". Il n'est pas apparent si cette méthode existe ou non à partir de votre explication - ce qui devrait résoudre votre problème si ce n'est pas le cas. – ryeMoss

+1

@ryemoss J'essaie de créer une carte Java. erreur sera augmenter dans la ligne 2 lorsque j'appelle la méthode put de la classe Java Map. Le problème est que la classe Map est générique et qu'elle prend des arguments génériques, pas seulement des chaînes. – Reza

Répondre

1

Après des heures d'essayer j'ai trouvé ce code pour convertir mon C# dictainary à AndroidJavaObject HashMap

public static AndroidJavaObject CreateJavaMapFromDictainary(IDictionary<string, string> parameters) 
{ 
    AndroidJavaObject javaMap = new AndroidJavaObject("java.util.HashMap"); 
    IntPtr putMethod = AndroidJNIHelper.GetMethodID(
     javaMap.GetRawClass(), "put", 
      "(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;"); 

    object[] args = new object[2]; 
    foreach (KeyValuePair<string, string> kvp in parameters) 
    { 

     using (AndroidJavaObject k = new AndroidJavaObject(
      "java.lang.String", kvp.Key)) 
     { 
      using (AndroidJavaObject v = new AndroidJavaObject(
       "java.lang.String", kvp.Value)) 
      { 
       args[0] = k; 
       args[1] = v; 
       AndroidJNI.CallObjectMethod(javaMap.GetRawObject(), 
         putMethod, AndroidJNIHelper.CreateJNIArgArray(args)); 
      } 
     } 
    } 

    return javaMap; 
} 

Alors j'appelle simplement ma méthode et le chemin de la carte comme cette

AndroidJavaObject javaMap = CreateJavaMapFromDictainary(myDictainry); 
AndroidJavaClass javaClass = new AndroidJavaClass("com.alirezaahmadi.android.sdk.core.BaseAPI"); 
javaClass.CallStatic("myMethod", javaMap); 
+0

Si quelqu'un veut utiliser ceci avec une chaîne, hashmap de l'objet. Ils doivent faire très attention en supposant que la valeur est toujours 'compatible' avec les nouveaux arguments constructeurs java String() - par ex. L'objet n'est pas valide, pas plus que de nombreux types de tableaux. Pour que le code gère plus de types, vous devez utiliser le static String.valueOf - il gère les tableaux et les objets. Comme ça . 'var stringClazz = new AndroidJavaClass (" java.lang.String "); var value = stringClazz.CallStatic ("valueOf", kvp.Value); ' – joensson