簡體   English   中英

使用參數 Map 調用 Java 函數<String, String>來自帶有 std::map 的 C++<std::string, std::string>

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

當我在C++std::map<std::string, std::string> ,如何調用將Map<String, String>作為C++參數的Java函數。 當參數是 int 等簡單類型時,我知道如何從 C++ 調用 Java 函數,但如何調用 Map

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

有什么技巧可以實現這一目標嗎?

在 Java 函數中通過索引使用jobjectArrays of jstring兩個jobjectArrays of jstring和膠水來映射 Map 還是有更優雅的解決方案?

如果 Java 函數采用Map<String,String> ,則必須傳遞該類型的對象。 正如您所注意到的,C++ std::map不是 Java Map。 在調用 Java 函數之前Map<String,String>您可以將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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM