使用参数Map <string,string =“”>从c ++调用Java函数,使用std :: map <std :: string,std :: string =“”>

时间:2015-09-04 13:59:36

标签: java c++ java-native-interface jnienv

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

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

有什么技巧可以达到这个目的吗?

使用分开的两个jobjectArrays of jstring并通过索引粘贴到Java函数中的Map还是有更优雅的解决方案?

2 个答案:

答案 0 :(得分:0)

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

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

答案 1 :(得分:0)

没有简单的方法可以做到。您必须在代码内部构造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/recipeNo061