![](/img/trans.png)
[英]JNI what types can I use instead of given (unsigned int, const char*, const wchar_t*, … )
[英]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
只是向該函數發送普通垃圾。
也許是C ++ 101,但我不知道為什么我的#1機箱有問題。 有人請給我任何線索嗎?
謝謝!
std::string::c_str
返回的指針所指向的char
數組歸std::string
實例擁有。 這意味着,當您調用c_str
的string
超出范圍時,指向的數據將被刪除。
這是在情況#1中發生的情況。 jnu::ToString
的返回值(或任何其他臨時值)在表達式的末尾超出范圍,因此,一旦初始化cVar
,指向它的數據將被刪除,並且有一個懸空的指針。 任何取消引用懸空指針的嘗試都將導致未定義的行為。
在#2的情況下, jnu::ToString
返回的string
被復制到strVar
(或者可能被移動,或者Return Value Optimization啟動並且實際上沒有臨時創建;這沒關系)。 由strVar.c_str()
返回的指針指向的數據將繼續存在,直到strVar
超出范圍或需要重新分配其存儲空間為止。
在#3的情況下, jnu::ToString
返回的臨時string
將在整個表達式中繼續存在,因此可以通過對toCall
的調用toCall
。
案例4與案例2類似,除了jnu::SetString
如何填充strVara
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.