Android:获得C STD ::字符串到JNiexport出乎意料地清除了



在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(。

最新更新