因爲項目用到JNI,在調用本地方法時出了點問題,一直報這個錯
08-19 11:34:01.136: A/libc(6974): @@@ ABORTING: HEAP MEMORY CORRUPTION IN tmalloc_large addr=0x5c5f9cb8
08-19 11:34:01.161: A/libc(6974): Fatal signal 11 (SIGSEGV) at 0xdeadbaad (code=1), thread 6974 (m.auto.activity)
或者運行6,7秒後程序就無響應了,因爲這個問題,隨便把JNI研究了一下,先在這裏把這個問題記錄下來,給遇到同樣問題的朋友一些參考:
通過調試,發現問題出在調用這個本地方法時public static native double[] get_list();時出的問題
其對應方法如下:
JNIEXPORT jdoubleArray JNICALL Java_com_auto_service_SensorsService_get_1list
(JNIEnv *env, jclass obj){
jsize len=SensorsService::CarCheckUp_MaxValue_list.size();
jdouble * abc= new jdouble(len);
jdoubleArray args = (env)->NewDoubleArray(len);
for(unsigned int i =0;i<len;i++)
{
abc[i]=SensorsService::get_list[i];
}
env->SetDoubleArrayRegion(args,0,len,abc);
return args;
}
經過認真的測試,發現問題出在jdouble * abc= new jdouble(len);
這一句,將其改爲:jdouble * abc= new jdouble[len];
改了之後,程序可以正常運行。
原因分析:
jdouble * abc = new jdouble(len);的作用是申請一個double變量空間,賦初值爲len,並定義一個double型指針abc指向該地址空間
jdouble * abc = new jdouble[len];的作用是申請len個double變量空間,沒有賦初始值,並定義一個double型指針abc指向該地址空間開始處
對於前者"new jdouble(len)",給其賦值其結果導致數組越界。
C語言編譯器不會自己檢查數組越界的,要靠程序員自己注意
如果越界,一般來說同樣可以修改、訪問,所以你的程序輸出結果不變
但是要知道:越界部分是別的部分的數據甚至代碼,修改、訪問可能導致程序錯誤
不知爲什麼<span style="font-size:14px;background-color: rgb(255, 255, 255);">總有,發現去不掉,以爲換下行就行,卻越改越多,是個bug,希望網站早點修復,大家先將就看吧。
有錯誤的地方,歡迎指正,評論,磚頭^^。