簡體   English   中英

JNI中const char *的壽命是多少?

[英]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_strstring超出范圍時,指向的數據將被刪除。

這是在情況#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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM