java - C++ 将 HashMap<string, boolean> 对象返回给 Java

标签 java c++ java-native-interface

我有一个 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/

相关文章:

java - "Cannot find symbol"为我自己的类(class)

c++ - C++中调用静态成员的方法进行初始化

java - 最佳实践 : Where to resample PCM and which tool?

android - JNI 检测到应用程序错误 : can't call void android. graphics.Canvas.drawBitmap

java - 在 Java(API) 中合并两个音频文件(不是 concat)?

java - 如何从 Java jar 文件中读取资源文件?

java - 向数据库插入数据后如何刷新JTable?

c++ - 将 boost 多精度与三角函数结合使用

c++ - QT:动态子按钮不可见

android - 来自 Android JNI 中任何线程的 FindClass