使用 std::map<:string, std::string, std::string> c++ 调用 Java 函数<String, 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>
时,我如何调用Java
函数,该函数将Map<String, String>
作为C++
的参数。我知道如何从c++调用Java函数当参数是int等简单类型时,但如何调用Map
t.env->CallStaticVoidMethod(t.classID, t.methodID, params);
有什么技巧可以做到这一点吗?
在Java函数中使用分隔的两个jobjectArrays of jstring
和胶水,或者有更优雅的解决方案吗?
如果Java函数采用Map<String,String>
类型,则必须传递该类型的对象。正如您所注意到的,c++ std::map
不是Java Map。可以在调用Java函数之前将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
相关文章:
- cppcheck在const std::string[]上引发警告
- 将std::string传递给WriteConsole API
- 为std::string的某个索引赋值
- std中有类似find_last_of的函数,而string中没有
- 使用 std::string () const 函数启动线程或未来
- 当我们进行一些操作时,应该使用什么'std::string'或'std::stringstream'?
- 如何更改大小(std::string)
- std::string 的对象真的可以移动吗?
- SegFault 同时使用 std::string::operator+= 和函数作为参数
- 无法从 std::string 中提取C++ Unicode 符号
- std::string 构造函数如何处理固定大小的 char[]?
- 确切地说,如何解释 std::getline(stream, string) 函数在C++中填充的字符串
- C++:考虑C++ std::string 中双引号 (") 的字面含义,而不使用反斜杠 (\)
- 'int main(int, int, std::__cxx11::string, std::__cxx11::string)'只需要零或两个参数 [-Wmain]
- C++ 在列表和列表之间选择返回类型<<string>std::p air<string,string>>
- std::string, std::wstring and UTF8
- uan inplace replacement of std::string/std::wstring?
- #define Glib::string std:wstring
- 从 std::string & std::wstring 中获取 char 整数值
- BSTR转换为std::string(std::wstring),反之亦然