#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. Вы уверены, что выделили правильные примеры успеха? Я бы подумал, что все случаи, когда вы передаете примитив, завершатся неудачей, а все случаи, когда вы передаете объект, такой как строка, завершатся успешно. Если это так, то прямо здесь есть большая подсказка.