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