牛骨文教育服务平台(让学习变的简单)
博文笔记

JNI数组类型转换遇到问题及解决(new jdouble(len)与new jdouble[len]的区别)

创建时间:2013-08-19 投稿人: 浏览次数:178

  因为项目用到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,希望网站早点修复,大家先将就看吧。

有错误的地方,欢迎指正,评论,砖头^^。


声明:该文观点仅代表作者本人,牛骨文系教育信息发布平台,牛骨文仅提供信息存储空间服务。