使用 std::map<:string, std::string, std::string> c++ 调用 Java 函数<String, String>

Call Java function with parameter Map<String, String> from c++ with std::map<std::string, std::string>

本文关键字:string std lt String gt 函数 map Java 调用 c++ 使用      更新时间:2023-10-16

当我在c++中有std::map<std::string, std::string>时,我如何调用Java函数,该函数将Map<String, String>作为C++的参数。我知道如何从c++调用Java函数当参数是int等简单类型时,但如何调用Map

t.env->CallStaticVoidMethod(t.classID, t.methodID, params);

有什么技巧可以做到这一点吗?

在Java函数中使用分隔的两个jobjectArrays of jstring和胶水,或者有更优雅的解决方案吗?

如果Java函数采用Map<String,String>类型,则必须传递该类型的对象。正如您所注意到的,c++ std::map不是Java Map。可以在调用Java函数之前将std::map<std::string,std::string>复制到新构造的Java Map<String,String>中。

这将需要从c++创建一个Java Map(例如,HashMap),并填充它

要做到这一点并不容易。你必须在你的代码中构造HashMap<String, String>

你需要这样写:

// Creating HashMap - we have to instantiate object of class HashMap
jclass hashMapClass = env->FindClass("java/util/HashMap");
// Get the constructor of HashMap
jmethodID hashMapConstructorID = env->GetMethodID(hashMapClass, "<init>", "()V");
jobject hashMap = env->NewObject(hashMapClass, hashMapConstructorID);
// Get id of 'put' method
jmethodID putMethodID 
  = env->GetMethodID(
      hashMapClass, 
      "put", 
      "(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;");
// For each pair inside 'map' I will call 'put' of Java based HashMap
for(auto const &pair: map) {
  jstring key   = env->NewStringUTF ( pair.first.c_str() );
  jstring value = env->NewStringUTF ( pair.second.c_str() );
  env->CallObjectMethod(hashMap, putMethodID, key, value);
}

一旦你填好了HashMap,你就可以在HashMap作为参数的地方调用你的方法。

您可以在这里找到完整的示例代码:https://github.com/mkowsiak/jnicookbook/tree/master/recipes/recipeNo061