Преобразование словаря C в хэш-таблицу

#java #android #java-native-interface #hashtable

#java #Android #java-native-interface #хеш-таблица

Вопрос:

Я создаю функцию для преобразования Map в jobject в JNI
и отправляю этот jobject на JAVA…

логическое значение нормально, но строка и целое число будут аварийно завершены….
Почему процесс завершается сбоем при string и integer?

 typedef Map<std::string, AbObj> Dictionary;

jobject Dictionary2jobject(JNIEnv *env, Dictionary* pDictionary)
{
    jclass class_Hashtable=env->FindClass("java/util/Hashtable");
    jmethodID construct_method=env->GetMethodID( class_Hashtable, "<init>","()V");
    jobject objMap = env->NewObject(class_Hashtable, construct_method, "");
    jmethodID add_method= env->GetMethodID(class_Hashtable,"put","(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;");

    for(Dictionary::const_iterator it = pDictionary->begin(); it != pDictionary->end();   it)
    {
        switch(it->second.GetType())
        {
        case AbObj::OT_NIL:
            return NULL;
        case AbObj::OT_STR:
            {
                env->CallObjectMethod(objMap, add_method, env->NewStringUTF(it->first.c_str()), env->NewStringUTF(it->second.data._str));
            }
            break;
        case AbObj::OT_BLN:
            {
                env->CallObjectMethod(objMap, add_method, env->NewStringUTF(it->first.c_str()), (jboolean)it->second.data._bln);
            }
            break;
        case AbObj::OT_S32:     //int32_t
            {
                env->CallObjectMethod(objMap, add_method, env->NewStringUTF(it->first.c_str()), (jint)999);
            }
            break;
        case AbObj::OT_S64:     //int64_t
            {
                env->CallObjectMethod(objMap, add_method, env->NewStringUTF(it->first.c_str()), (jdouble)it->second.data._s64);
            }
            break;
    }
}
return objMap;
  

}

Комментарии:

1. Работают ли выражения, передающие значение четвертого аргумента, сами по себе? т.Е. перед вызовом CallObjectMethod()?

2. Да, все значения верны..

3. Вы уверены, что выделили правильные примеры успеха? Я бы подумал, что все случаи, когда вы передаете примитив, завершатся неудачей, а все случаи, когда вы передаете объект, такой как строка, завершатся успешно. Если это так, то прямо здесь есть большая подсказка.