有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

安卓将C++无序映射转换成java HASMAP,然后使用JNI将其返回到java

在Android平台上,我有一个非常大的C++ ^ {CD1>},我想用JNI返回java作为一个哈希映射。p>
extern "C" JNIEXPORT jobject JNICALL Java_quantum_QUANTUM_getMessage(JNIEnv *env, jobject thisObj, jdoubleArray bbox) {

    unordered_map<int, Foo> Map;
    Map = getData(filename, bbox);

    // convert Map to java object
    // return java object
}

我对JNI很陌生。我还没有找到任何关于如何做这件事的有用材料

我在下面的链接中尝试了这种方法,但我在这方面遇到了很多编译错误

how to correctly send a std::map<> from C++ to Java through JNI?

另一个建议是在JNI上传递一个空的javaHashmap并填充它。但我不知道该怎么做。更好的解决方案是什么


共 (1) 个答案

  1. # 1 楼答案

    这需要一些调整。可以通过在C++内创建Map对象,或者通过将MapJava传递到C++并在那里填充来实现

    基本上,你需要的是:

    1. 创建HashMap
      jclass mapClass = env->FindClass("java/util/HashMap");
      if(mapClass == NULL) {
        return NULL;                  // alternatively, throw exception (recipeNo019)
      }
    
      jobject hashMap = env->NewObject(mapClass, mapConstructorID);
      if(hashMap == NULL) {
        return NULL;                  // as above
      }
    
    1. 确保将基本类型嵌入对象中(例如,可以将int嵌入Integer
      jclass integerClass = env->FindClass("java/lang/Integer");
      if(integerClass == NULL) {
        return NULL;                  // alternatively, throw exception (recipeNo019)
      }
    
      jmethodID integerConstructorID = env->GetMethodID(integerClass, "<init>", "(I)V");
      if(integerConstructorID == NULL) {
        return NULL;
      }
    
      ...
      ...
    
      jobject key = env->NewObject(integerClass, integerConstructorID, pair.first);
    
    1. 用数据填充HashMap
      for (auto const& pair: map) {
        jobject key = env->NewObject(integerClass, integerConstructorID, pair.first);
        jobject value = env->NewObject(integerClass, integerConstructorID, pair.second);
        if(key == NULL || value == NULL) {
          return NULL;
        }
        env->CallObjectMethod(hashMap, putMethodID, key, value);
      }
    

    就这样。您可以在这里找到完整的示例代码:

    https://github.com/mkowsiak/jnicookbook/tree/master/recipes/recipeNo047 https://github.com/mkowsiak/jnicookbook/tree/master/recipes/recipeNo048