使用参数映射调用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
复制到新构造的Javamap
<>这需要从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++对象,从那里做你需要的一切。如果你想了解更多细节,请告诉我。