Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/153.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用参数映射调用Java函数<;字符串,字符串>;来自c++;使用std::map<;标准::字符串,标准::字符串>; >如何调用 java < /C>函数,将 map < /COD>作为参数从 C++ >代码> >当我有C++代码:STD::MAP< /Cord> C++。 我知道如何调用C++ java函数,当参数是简单类型,如int等,但如何调用map < /p> t.env->CallStaticVoidMethod(t.classID, t.methodID, params);_Java_C++_Java Native Interface_Jnienv - Fatal编程技术网

使用参数映射调用Java函数<;字符串,字符串>;来自c++;使用std::map<;标准::字符串,标准::字符串>; >如何调用 java < /C>函数,将 map < /COD>作为参数从 C++ >代码> >当我有C++代码:STD::MAP< /Cord> C++。 我知道如何调用C++ java函数,当参数是简单类型,如int等,但如何调用map < /p> t.env->CallStaticVoidMethod(t.classID, t.methodID, params);

使用参数映射调用Java函数<;字符串,字符串>;来自c++;使用std::map<;标准::字符串,标准::字符串>; >如何调用 java < /C>函数,将 map < /COD>作为参数从 C++ >代码> >当我有C++代码:STD::MAP< /Cord> C++。 我知道如何调用C++ java函数,当参数是简单类型,如int等,但如何调用map < /p> t.env->CallStaticVoidMethod(t.classID, t.methodID, params);,java,c++,java-native-interface,jnienv,Java,C++,Java Native Interface,Jnienv,有什么诀窍可以做到这一点吗 要在Java函数中使用两个分开的jstringJobjectArray和glue by index来映射,还是有更优雅的解决方案?如果Java函数采用Map,则必须传递该类型的对象。正如您注意到的,C++ STD::MAP< /Cord>不是java映射。在调用Java函数之前,可以将std::map复制到新构造的Javamap 这需要从C++中创建一个java映射(例如,一个哈希图),并填充它。 没有简单的方法来实现它。您必须在代码中构造HashMap 您将需要以

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


要在Java函数中使用两个分开的jstring
JobjectArray
和glue by index来映射,还是有更优雅的解决方案?

如果Java函数采用
Map
,则必须传递该类型的对象。正如您注意到的,C++ <代码> STD::MAP< /Cord>不是java映射。在调用Java函数之前,可以将
std::map
复制到新构造的Java
map


<>这需要从C++中创建一个java映射(例如,一个哈希图),并填充它。

没有简单的方法来实现它。您必须在代码中构造
HashMap

您将需要以下内容:

// 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类的对象
jclass hashMapClass=env->FindClass(“java/util/HashMap”);
//获取HashMap的构造函数
jmethodID hashMapConstructorID=env->GetMethodID(hashMapClass,“,”()V”);
jobject hashMap=env->NewObject(hashMapClass,hashMapConstructorID);
//获取“put”方法的id
jmethodID
=env->GetMethodID(
hashMapClass,
“放”,
“(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;”;
//对于'map'中的每一对,我将调用基于Java的HashMap的'put'
用于(自动常量和对:映射){
jstring key=env->NewStringUTF(pair.first.c_str());
jstring value=env->NewStringUTF(pair.second.c_str());
env->CallObjectMethod(hashMap、putMethodID、key、value);
}
填充了
HashMap
后,可以在希望
HashMap
作为参数的位置调用方法


这里可以找到完整的示例代码:

如果java函数修改了map,则在函数返回后必须同步更改。如果java函数保留对参数的引用,则可能需要重新思考。使用JavaCPP这样的工具,可以简单地使用java的<>代码> STD::MAP< /Cord>C++对象,从那里做你需要的一切。如果你想了解更多细节,请告诉我。