在Android应用程序上,我正在尝试从本机代码中获取一个字符串到Java,但是正是在JNIEXPORT级别,STD :: String从其内容中擦除了。这是所有三层的代码:
C 代码(原始X-Patform类(:
std::string GTAInterface::GetConfigurationJSON()
{
std::string m_cfgJSON = "a bare test";
return m_cfgJSON;
}
C 包装器代码(因为Android上的JNI只能调用静态C 功能...在此上没有单词(:
const char *gtaGateway::GetConfigurationJSON(int sysId)
{
string ret = ((GTAInterface*)gtaSystemArray[sysId])->GetConfigurationJSON();
return ret.c_str(); // here the "ret" string is still retaining the retrieved value
}
最后,jniexport类:
JNIEXPORT jstring JNICALL
Java_com_gta_sdk_gtaGateway_GetConfigurationJSON(JNIEnv *env, jobject obj, jint sys)
{
std::string cfgJson = gtaGateway::GetConfigurationJSON(sys);
return env->NewStringUTF(cfgJson.c_str()); // here the debugger shows that "cfgJson" is "" (empty)??!!
}
因此,该代码在所有呼叫链中都正确执行,但是由于某些原因,我无法弄清楚为什么" CFGJSON"字符串 @ jniexport级别清除了!有人可以帮忙吗
非常感谢!
您的基础string
对象被破坏。
此代码
const char *gtaGateway::GetConfigurationJSON(int sysId)
{
string ret = ((GTAInterface*)gtaSystemArray[sysId])->GetConfigurationJSON();
return ret.c_str(); // here the "ret" string is still retaining the retrieved value
}
将指针返回到C风格的字符串,但根据c_str()
方法文档
返回的指针可能会因修改对象的其他成员函数的进一步调用而无效。
当您的gtaGateway::GetConfigurationJSON()
方法返回时,调用string
对象的驱动器。我认为这可能是"修改对象"的。
我没有测试过,但是我怀疑该代码会起作用:
const string gtaGateway::GetConfigurationJSON(int sysId)
{
string ret = ((GTAInterface*)gtaSystemArray[sysId])->GetConfigurationJSON();
return ret;
}
注意,返回现在是string
对象,而不是要破坏的对象的C弦指针。
所以,刚刚抓到了这个问题(感谢安德鲁的鼓舞人心(:带有监视器和负载测试的"赫普追逐"使我进入了腐败点(应用程序中的其他地方(。..未管理的商品和坏处:(
因此,以防万一其他人需要它,问题中暴露的方法是完美工作的,以及我最初的尝试传递std :: string-s一直通过呼叫链一直``直到jstring(。