2

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

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

有什么诀窍可以做到这一点吗?

在 Java 函数中使用分隔的两个jobjectArrays of jstring并按索引粘合到 Map 还是有更优雅的解决方案?

4

2 回答 2

0

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

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

于 2015-09-04T14:58:50.480 回答
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/recipes/recipeNo061

于 2019-09-19T14:21:46.560 回答