2014-09-29 33 views
0

我正在制作一个X平台库,我试图将它导出到Java。从C++通过JNI返回空字符串到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)

EDIT 2 我想这样的:

string getMyString(string JSON, long proof) { 
    string result = ""; 
    return result; 
} 

什么日志打印我的是:

Ж)¤

+0

您应该创建一个的jstring对象,从JNI调用返回此。 – mkaes 2014-09-29 10:42:06

+0

我调试打印结果(常量字符*类型),并通过jstring发送它作为'jstring结果=(env) - > NewStringUTF(matchingString);' – 2014-09-29 10:53:14

回答

0

你返回char const*指向到一个局部变量 ,这将破坏当你离开功能。 您应该返回std::string,其中JNI包装 直接转换为jstring

+0

得到>致命信号11(SIGSEGV)在0x00000004(代码= 1) ,线程17339(w.opencvtesting) – 2014-09-29 11:34:37

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()); 
} 
+0

得到>致命信号11(SIGSEGV)在0x00000004(代码= 1),线程17339(w.opencvtesting) – 2014-09-29 11:21:27