1. 程式人生 > >使用jni遇到的詭異內存bug

使用jni遇到的詭異內存bug

sage temp return 詭異 tostring bug 通過 con wstring

jni返回到java層的字符串有時正確,有時錯誤。錯誤的字符串可能是任何一串字符,看起來很奇怪。

通過加日誌,得知生成的jstring已經不正確了,所以懷疑生成jstring用的char*有問題,可能被釋放了。

分析代碼,裏邊用的char*是從string轉來的,只要string沒被釋放,char*就沒問題。

問題找到了,代碼只持有了char*,沒有持有string,string在獲取char*之後就可以被釋放了,string釋放之後,char*的指向就錯誤了,所以生成的jstring就錯誤了。

問題代碼如下:


MD5 iMD5;
iMD5.GenerateMD5((unsigned char *) finalMessage, strlen(finalMessage));


const char *result = iMD5.ToString().c_str();// 這裏沒有持有toString生成的string,string後面就釋放了。

//生成java String

jstring ret = env->NewStringUTF(result);

return ret;

修改如下:

string tempStr = iMD5.ToString();// 繼續持有string
const char *result = tempStr.c_str();

// 生成java String
jstring ret = env->NewStringUTF(result);

return ret

使用jni遇到的詭異內存bug