如何将 cocos2d ValueMap 作为 HashMap 发送到 Java

How to send cocos2d ValueMap to Java as HashMap?

本文关键字:Java HashMap 作为 cocos2d ValueMap      更新时间:2023-10-16

我有cocos2d:: ValueMap

 ValueMap map;
 map["key1"] = "value1";
 map["key2"] = 1;
 map["key3"] = true;

我想把它作为HashMap<String,Object>发送到Java。

所以我写了以下代码来生成jobject hashMapObj,我想用值填充它:

jclass hashMapClass= jniGetInstance.env->FindClass("java/util/HashMap");
jmethodID hashMapInit = jniGetInstance.env->GetMethodID(hashMapClass, "<init>", "(I)V");
jobject hashMapObj = jniGetInstance.env->NewObject(hashMapClass, hashMapInit, values.size());
//javap -s -p java.util.HashMap  | grep -A 1 put(
jmethodID hashMapId = jniGetInstance.env->GetMethodID(hashMapClass, "put", "(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;");
for (auto it : map) {   //https://github.com/cocos2d/cocos2d-x/blob/v3/cocos/base/CCValue.h
    switch (it.second.getType()) {
        case cocos2d::Value::Type::BOOLEAN:
            jniGetInstance.env->CallObjectMethod(hashMapObj, hashMapId, "put",
                                                 jniGetInstance.env->NewStringUTF(
                                                         it.first.c_str()),
                                                 it.second.asBool());
            break;
       //...
        default:
            break;
    }
}

我排队崩溃:

jniGetInstance.env->CallObjectMethod(
   hashMapObj, 
   hashMapId,
   "put", 
   jniGetInstance.env->NewStringUTF(                                             
               it.first.c_str()),
               it.second.asBool());

JNI 在应用程序中检测到错误:使用了无效的 J对象0xd85d4aa0

编辑

jniGetInstance.env->CallObjectMethod(hashMapObj, hashMapId, "put","someString", true);

失败并出现相同的错误,因此问题出在hashMapObj

有什么想法吗?

更改

jniGetInstance.env->CallObjectMethod(hashMapObj, hashMapId, "put",
    jniGetInstance.env->NewStringUTF(
        it.first.c_str()),
        it.second.asBool());

jniGetInstance.env->CallObjectMethod(hashMapObj, hashMapId,
    jniGetInstance.env->NewStringUTF(it.first.c_str()),
    it.second.asBool());

由于"放置"方法仅接受 2 个参数。

还要确保it.second.asBool()返回jboolean - 它与C++ bool类型不同。