将空字符串从C ++返回到JNI到Java

时间:2014-09-29 10:19:42

标签: java c++ java-native-interface

我正在创建一个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;
}

以及日志打印的内容是:

  

Ж)¤

2 个答案:

答案 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