我在 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
对象或将 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/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/