Преобразование unordered_map в c ++ в jash hashMap перед возвратом в java с использованием JNI - PullRequest
0 голосов
/ 12 июня 2019

У меня очень большой c ++ unordered_map на платформе Android. Я хотел бы вернуть это как hashMap в java, используя JNI.

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.Я не нашел никакого полезного материала о том, как это сделать.

Я попробовал подход в ссылке ниже, но я получаю много ошибок компиляции по этому поводу.

какправильно отправить std :: map <> из C ++ в Java через JNI?

Еще одним предложением было передать пустой javaHashmap через JNI и заполнить его.Но я не уверен, как это сделать.что является лучшим решением?

1 Ответ

0 голосов
/ 12 июня 2019

Это потребует некоторых настроек. Вы можете сделать это, создав Map объект внутри C++ или передав Map из Java в 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/recipeNo047 https://github.com/mkowsiak/jnicookbook/tree/master/recipeNo048

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...