C++ 在蜂巢上使用skia绘图时内存崩溃
我有一个在堆栈上实例化“SkPath”对象的函数。在此之后,我调用了一些函数,如“moveTo”、“lineTo”、“cubicTo”(这只是将新点添加到SkPath对象内部的内部数组中)。然后我在堆栈上实例化“SkPaint”类的对象 然后调用“SkCanvas”对象的“drawPath”函数,并将SkPath和SkPaint对象作为args传递,然后崩溃 我做了一些调查。结果表明,SkPath中的数组不再有效,因为SkPaint的构造函数正在通过调用C++ 在蜂巢上使用skia绘图时内存崩溃,c++,android,android-ndk,android-3.0-honeycomb,skia,C++,Android,Android Ndk,Android 3.0 Honeycomb,Skia,我有一个在堆栈上实例化“SkPath”对象的函数。在此之后,我调用了一些函数,如“moveTo”、“lineTo”、“cubicTo”(这只是将新点添加到SkPath对象内部的内部数组中)。然后我在堆栈上实例化“SkPaint”类的对象 然后调用“SkCanvas”对象的“drawPath”函数,并将SkPath和SkPaint对象作为args传递,然后崩溃 我做了一些调查。结果表明,SkPath中的数组不再有效,因为SkPaint的构造函数正在通过调用sk_bzero(this,sizeof(
sk_bzero(this,sizeof(*this)),使其(SkPaint的)对象为空代码>(“memset”为0表示大小为“*指针”的“指针”),通过这样做,它还以某种方式清除指向数组的指针,该数组属于先前声明的SkPath对象
我已经通过在SkPath之前实例化SkPaint修复了它,但问题仍然存在,因为我没有更多类似于此的问题,而且。。。我想知道发生了什么事。
同样的代码在Android2.2上也可以正常工作
我没有使用硬件加速
SkPath skPath;
skPath.setFillType(fillType);
skPath.moveTo(x1, y1);
skPath.cubicTo(x1, y1, x2, y2, x3, y3);
skPath.lineTo(x1, y1);
skPath.close();
SkPaint paint; //<- will call constructor that cleans up pointer to array
paint.setAntiAlias(true);
GfxRGB rgb;
state->getFillRGB(&rgb);
paint.setColor(GfxRGB2SkColor(rgb));
paint.setStyle(SkPaint::kFill_Style);
paint.setAlpha((U8CPU) (state->getFillOpacity() * 255));
canvas->drawPath(skPath, paint); // <- will crash here
SkPath-SkPath;
skPath.setFillType(fillType);
skPath.moveTo(x1,y1);
立方(x1,y1,x2,y2,x3,y3);
skPath.lineTo(x1,y1);
skPath.close();
油漆//getFillRGB(&rgb);
油漆颜色(GfxRGB2SkColor(rgb));
油漆.设置样式(SkPaint::kFill_样式);
setAlpha((U8CPU)(state->getFillOpacity()*255));
画布->绘图路径(skPath,绘制);//您没有显示canvas
是如何初始化的-它可以为空吗?另外,您正在使用objectskPath
,但将path
传递给drawPath
,因此这要么无法编译,要么遗漏了重要的细节。此外,如果您尝试在SkPoint实例化之后立即调用getPoints,将引发异常。它是否可能与Motorolla Xoom硬件架构有关?可能是因为双核处理器?@Mat No,“canvas”初始化正确。正如我之前提到的,如果在SkPath之前初始化SkPaint,它就会工作。根据“路径”而不是“skPath”,我在复制粘贴时错误地将其留在了那里。对不起,您没有显示如何初始化画布,它可以为空吗?另外,您正在使用objectskPath
,但将path
传递给drawPath
,因此这要么无法编译,要么遗漏了重要的细节。此外,如果您尝试在SkPoint实例化之后立即调用getPoints,将引发异常。它是否可能与Motorolla Xoom硬件架构有关?可能是因为双核处理器?@Mat No,“canvas”初始化正确。正如我之前提到的,如果在SkPath之前初始化SkPaint,它就会工作。根据“路径”而不是“skPath”,我在复制粘贴时错误地将其留在了那里。很抱歉