我正在创建一个X平台库,我正在尝试将其导出为Java。
有一个函数可以返回一个字符串:
C ++代码
string results = "";
for (vector<int>::size_type i = 0; i < resultsDouble.size(); i++) {
for (it_type3 it = distances.begin(); it != distances.end(); ++it) {
String key = it->first;
double value = distances.at(key);
if (value == resultsDouble.at(i)) {
typesString.push_back(key);
results = results + " " + key;
}
}
}
char const* resultsChar = results.c_str();
return resultsChar;
在Java上打印时,即使在JNI调用它也是空的。
如果我制作to_string(results).c_str();
但我知道字符串不是空的,因为当我打印to_string(results.length()).c_str();
时,它显示我435。
为什么它会显示一个空字符串?
感谢。
修改
如果我将结果更改为字符串,我会得到:
致命信号11(SIGSEGV)位于0x00000004(代码= 1),线程17339(w.opencvtesting)
编辑2 我正试图这样做:
string getMyString(string JSON, long proof) {
string result = "";
return result;
}
以及日志打印的内容是:
Ж)¤
答案 0 :(得分:2)
您的C ++代码似乎不正确,因为您返回指向本地string results
数据的指针,该函数在函数退出时被销毁。你应该把它改成:
string getMyString(...) {
string results = "";
...
return results;
}
然后像你一样转换为jstring
:
jstring Java_com_MyFunc(JNIEnv* env, ...) {
string result = getMyString(...);
return env->NewStringUTF(result.c_str());
}
答案 1 :(得分:0)
您将返回指向本地的char const*
变量,当你离开函数时将被破坏。
你应该返回一个std::string
,它是JNI包装器
直接转换为jstring
。