JNI 中常量字符* 的寿命是多少?
What is the lifespan of a const char* in JNI?
我正在研究一个基于 Android NDK 的代码,我不明白我的字符串文字的寿命有多长。 我的程序是一个C++游戏,它不时与Android Java端交互 - 例如在服务器上上传数据,连接到Facebook等。
在从Java到(原生)C++的下降调用中,我使用不同的方式将jstring
转换为const char*
,我意识到有些工作,但另一个不起作用。我不明白为什么。
例如:在 JNI 下降调用中,其中toCall(const char*)
是其他地方定义的常规C++函数。
JNIEXPORT void JNICALL Java_com_alpha_beta_Gamma_onDelta(JNIEnv *env, jclass, jstring jstr) {
// #1
const char* cVar = jnu::ToString(jstr).c_str();
toCall(cVar);
// #2
std::string strVar = jnu::ToString(jstr);
toCall(strVar.c_str())
// #3
toCall(jnu::ToString(jstr).c_str());
// #4
std::string strVara;
jnu::SetString(jstr, strVara);
toCall(strVara.c_str());
}
jnu
函数是:
std::string jnu::ToString(JNIEnv *env, jstring jstr) {
if (jstr) {
const char *cstr = env->GetStringUTFChars(jstr, NULL);
std::string str = cstr;
env->ReleaseStringUTFChars(jstr, cstr);
return str;
}
return std::string();
}
std::string& jnu::SetString(JNIEnv* env, jstring jstr, std::string& output) {
if (jstr) {
const char *cstr = env->GetStringUTFChars(jstr, NULL);
output = cstr;
env->ReleaseStringUTFChars(jstr, cstr);
}
return output;
}
#2
、#3
和#4
的情况下工作正常,而#1
只是将普通垃圾发送到函数进行调用。
也许是 101 C++,但我不明白为什么我的 #1 案例有问题。有人请给我任何线索吗?
谢谢!
std::string::c_str
返回的指针指向的char
数组归std::string
实例所有。 这意味着,当您调用c_str
的string
超出范围时,指向的数据将被删除。
这就是案例#1中发生的情况。jnu::ToString
(或任何其他临时)的返回值在表达式末尾超出范围,因此一旦您初始化cVar
它指向的数据,就会被删除,并且您有一个悬空的指针。 任何取消引用悬空指针的尝试都将导致未定义的行为。
在 #2 的情况下,jnu::ToString
返回的string
被复制到strVar
(或者可能被移动,或者返回值优化启动并且实际上没有创建临时;这并不重要)。strVar.c_str()
返回的指针指向的数据将继续存在,直到strVar
超出范围或需要重新分配其存储。
在 #3 的情况下,jnu::ToString
返回的临时string
将通过完整表达式继续存在,因此它通过调用toCall
而幸存下来。
案例 #4 与 #2 类似,除了jnu::SetString
如何填充strVara
。
- #定义c-预处理器常量..我做错了什么
- 用C++中的一个变量定义一个常量
- 什么时候在C++中返回常量引用是个好主意
- 代理对象的常量正确性
- 我想将一个对T类型的非常量左值引用绑定到一个T类型的临时值
- 通过多个头文件使用常量变量
- 复制列表初始化的隐式转换的等级是多少
- 在cuda线程之间共享大量常量数据
- 不能在初始值设定项列表中将非常量表达式从类型 'int' 缩小到'unsigned long long'
- 有没有什么方法可以使用一个函数中定义的常量变量,也可以由c++中同一程序中的其他函数使用
- while循环中while循环的时间复杂度是多少
- 是默认情况下分配给char数组常量的值
- 私有类型的静态常量成员
- 类似枚举的计算常量
- 递归模板化函数不能分配给具有常量限定类型"const tt &"的变量"state"
- 为什么我可以通过引用修改常量返回
- 如何检查一个c++字符串中有多少相同的字符/数字
- C++有多少类型的循环
- 在 Cpp 标头中声明的常量变量应具有多少个符号条目
- JNI 中常量字符* 的寿命是多少?