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

Returning empty string from C++ through JNI to Java

本文关键字:JNI 返回 Java 通过 C++ 字符串      更新时间:2023-10-16

我正在制作一个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;
}

日志打印我的是:

Ж(¤

您的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());
}

您返回的char const*指向局部变量,当您离开函数时将被销毁。你应该返回一个std::string,JNI包装器直接转换为jstring