使用 Unity AndroidJavaObject 创建 Java 哈希图



我的java库中有一个方法,可以获取Map作为输入。
这是我的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 是一个通用类,这段代码不起作用

当我运行这个时,我收到此错误

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

最新更新