JNI數組類型轉換遇到問題及解決(new jdouble(len)與new jdouble[len]的區別)

  因爲項目用到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,希望網站早點修復,大家先將就看吧。

有錯誤的地方,歡迎指正,評論,磚頭^^。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章