java - 在使用 JNI 将 c++ unordered_map 返回到 java 之前将其转换为 java hashMap

标签 java android c++ hashmap java-native-interface

我在 android 平台上有一个非常大的 c++ unordered_map 我想使用 JNI 将其作为 java 中的 hashMap 返回。

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 还很陌生。我还没有找到任何关于如何执行此操作的有用 Material 。

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

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

另一个建议是通过 JNI 传递一个空的 javaHashmap 并填充它。但我不确定如何做到这一点。更好的解决方案是什么?

最佳答案

这需要一些调整。您可以通过在 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
  }
  • 确保将原始类型嵌入到对象中(例如,您可以将 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);
    
  • 用数据填充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

    关于java - 在使用 JNI 将 c++ unordered_map 返回到 java 之前将其转换为 java hashMap,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56561789/

    相关文章:

    c++ - 我的平方根函数没有给出某些数字的准确结果

    java - Spring数据,按嵌套对象的属性查找

    java - 如何找到存储在由每个值的深度加权的整数二叉树中的值的总和?

    android - Textview drawable 不在远程 View 中显示可绘制图像

    android - 如何处理内存不足异常?

    android - 安卓条形码/二维码阅读器

    java - 如何为基于通用容器的递归类集调用基于供应商的构造函数?

    java - PaintComponent() 被调用但 JComponent 未被绘制

    c++ - 从 std::string 转换为 bool

    c++ - 无法链接到 OpenCV (Linux) 的共享库