使用 Unity AndroidJavaObject 创建 java hashmap

create java hashmap with Unity AndroidJavaObject

我的 java 库中有一个方法可以获取地图作为输入。
这是我的 java 方法

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

还有我在 Unity 中的 C# 代码

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);

我可以尝试一些这样的代码,但是 Map 是通用的 class 并且此代码不起作用

当我 运行 我得到这个错误

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;

我该如何解决这个问题并将 java 散列映射指向此方法。顺便说一句,我无法更改 java 代码。

经过几个小时的尝试,我发现这段代码可以将我的 C# 字典转换为 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;
}

然后我只需像这样调用我的方法和路径地图

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

这是我使用的 Reza 解决方案的简化版本:

public AndroidJavaObject ConvertDictionaryToJavaMap(Dictionary<string, string> dictionary) {

    AndroidJavaObject map = new AndroidJavaObject("java.util.HashMap");
    IntPtr putMethod = AndroidJNIHelper.GetMethodID(map.GetRawClass(), "put", "(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;");
    foreach (var entry in dictionary) {
        AndroidJNI.CallObjectMethod(
            map.GetRawObject(),
            putMethod,
            AndroidJNIHelper.CreateJNIArgArray(new object[] { entry.Key, entry.Value })
        );
    }
    return map;
}