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,希望网站早点修复,大家先将就看吧。
有错误的地方,欢迎指正,评论,砖头^^。
声明:该文观点仅代表作者本人,牛骨文系教育信息发布平台,牛骨文仅提供信息存储空间服务。
- 上一篇: php array_unshift()修改数组key
- 下一篇: php 修改多维数组的值