gpt4 book ai didi

java - C++ 将 HashMap 对象返回给 Java

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:54:33 26 4
gpt4 key购买 nike

我有一个 JAVA 调用的 JNI 函数,它需要构建并返回一个 HashMap。 map 的键是“字符串”,相应的值是“boolean 值”或“boolean 值”(只要有效,任何一个都可以)。使用我当前的代码(如下),字符串已成功添加到返回的映射中,并且可以在 Java 中访问。然而,当试图访问 JAVA 中的值时,它出现为空。

jclass mapclass = env->FindClass("java/util/HashMap");
jmethodID initmeth = env->GetMethodID(mapclass, "<init>", "()V");
jmethodID putmeth = env->GetMethodID(mapclass, "put", "(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;");
jobject roster_return = env->NewObject(mapclass, initmeth);

int roster_map_size;
std::map<std::string, RosterItem>* roster_map = GetRosterMap();
std::map<std::string, RosterItem>::iterator iter;
if (!roster_map || roster_map->size() < 1)
return roster_return;

iter = roster_map->begin();
while (iter != roster_map->end())
{
env->CallObjectMethod(roster_return, putmeth, env->NewStringUTF(iter->second.name.c_str()), (jboolean)iter->second.isfriend);
iter++;
}

我试过生成一个 boolean 对象,但我似乎无法弄清楚如何创建一个新对象。我尝试了以下代码,但它在 boolean 值“init”的“GetMethodID”上出错。

jclass mapclass = env->FindClass("java/util/HashMap");
jclass boolclass = env->FindClass("java/lang/Boolean");
jmethodID initmeth = env->GetMethodID(mapclass, "<init>", "()V");
//-----------------It errors on the next line-----------------------
jmethodID initbool = env->GetMethodID(boolclass, "<init>", "()V");
jmethodID putmeth = env->GetMethodID(mapclass, "put", "(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;");
jobject roster_return = env->NewObject(mapclass, initmeth);

int roster_map_size;
std::map<std::string, RosterItem>* roster_map = GetRosterMap();;
std::map<std::string, RosterItem>::iterator iter;
if (!roster_map || roster_map->size() < 1)
return roster_return;

iter = roster_map->begin();
while (iter != roster_map->end())
{
LOGE("adding contact: %s", iter->second.jid.Str().c_str());
//---Not sure what to pass in the next function here for the fourth argument---
env->CallObjectMethod(roster_return, putmeth, env->NewStringUTF(iter->second.name.c_str()), (jboolean)iter->second.isfriend);
iter++;
}

最佳答案

老问题,但我今天也在搜索这个。当您在两种语言之间来回切换时,很容易忘记 Java 的原始 boolean 类型与可为 null 的 Boolean Object 类型之间存在差异。 Map 的值必须是 Object,因此需要 Boolean

因此,要创建一个新的 Boolean 对象:

// Sample C++ boolean variable you want to convert to Java:
bool someBoolValue = true;

// Get the Boolean class
jclass boolClass = env->FindClass("java/lang/Boolean");
// Find the constructor that takes a boolean (note not Boolean) parameter:
jmethodID boolInitMethod = env->GetMethodID(boolClass, "<init>", "(Z)V");

// Create the object
jobject boolObj = env->NewObject(boolClass,
boolInitMethod,
someBoolValue ? JNI_TRUE : JNI_FALSE);

关于java - C++ 将 HashMap<string, boolean> 对象返回给 Java,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18501229/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com