首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C语言 >

阿里地区云手机应用开发,调用JNI接口,调用memcpy()函数出错

2012-09-04 
阿里云手机应用开发,调用JNI接口,调用memcpy()函数出错。JNI接口的实现中,有一段代码,功能是从一副图片中截

阿里云手机应用开发,调用JNI接口,调用memcpy()函数出错。
JNI接口的实现中,有一段代码,功能是从一副图片中截取中间一部分,具体实现是这样的:
unsigned char *fun(unsigned char *data, int width, int height, int leftTopX, int leftTopY, int nWidth, int nheight)
//data, 图片内存首地址,width, height, 图片宽和高;
//leftTopX, leftTopY,截取区域左上角的点坐标
//nWidth, nHeight, 截取区域的宽和高
{
  unsigned char *temp, *tempN;  
  unsigned char *pxl;
  int size = nWidth * nHeight;
  pxl = NULL;
  if ((pxl = (unsigned char *)malloc(size * sizeof(unsigned char))) == NULL)
  {
  return NULL;
  }
  memset(readImg->pxl, 0x00, sizeof(size * sizeof(unsigned char)));
  temp = data + width * leftTopY + leftTopX;
  tempN = pxl;
  for (i = 0; i < nHeight; i++)
  {
  __android_log_print(ANDROID_LOG_INFO, "[hello-jni.c]", "i is %d", i);
  memcpy(tempN, temp, nWidth);
  __android_log_write(ANDROID_LOG_INFO, "[hello-jni.c]", "123456789_0");
  temp += width;
  __android_log_write(ANDROID_LOG_INFO, "[hello-jni.c]", "123456789_1");
  tempN += nWidth;
  __android_log_write(ANDROID_LOG_INFO, "[hello-jni.c]", "123456789_2");
  }

  return pxl;
}

上面是这部分完整的代码,这个应用在大部分android手机上都没有问题,但在阿里云手机上就会出错。出现的问题是这样的,
假设nHeight是200,那要循环200次,可是从log上看,每次出错都是循环没有运行完,而且是memcpy这一句出错。

请大侠帮忙看看,问题怎么解决?

[解决办法]
temp += width;与tempN += nWidth;的地址同步了吗?否则一个地址用完了,而另一个没用完,就会出错。导致指针越界。
[解决办法]
感觉问题是在readImg->pxl这个全局变量上 悬空指针了可能
[解决办法]
循环次数多了就出问题,那么必然出在循环里。而是因为次数大了出问题,那必然是因为地址在不断递进过程中出问题了!我觉得还是我楼上回答的那样。LZ仔细看看temp += width与tempN += nWidth,两者的地址空间是否够用?是否其中一个或两个在循环200多次后,地址空间就用完了。
[解决办法]

探讨

我也觉得你说的这个有道理,只是前面给pxl申请空间时,指定的大小是足够的,如果申请不成功会提前退出,data是传进来的参数,data、temp、width一组,pxl、tempN、nWidth一组,单看log上打印的每次循环时的指针值,我查了十几个,都没有问题。你说的看两者的地址空间是否足够,怎么来验证呢?
谢谢。

引用:

循环次数多了就出问题,那么必然出在循环里……

[解决办法]
探讨

多谢谢大家的提示,我现在发现这个问题,我的接口是这样的:
unsigned char *fun(unsigned char *data, int width, int height, int leftTopX, int leftTopY, int nWidth, int nheight);
按正常思路,data所指向空间的大小应该和width、height匹配。
我最初想的是空间大小应该等……

热点排行
Bad Request.