Android 吉夫伦致命信号11
我正在尝试使用一些本地代码来创建GIF。 我使用paint绘制图像,创建一些笔划,单击save,然后将绘制的图像保存为JPG格式。当我单击CreateGIF时,它会获取所有图像并开始创建Gif。这是当我收到致命信号11时,应用程序重新启动 我使用本机代码,因此有崩溃的回溯:Android 吉夫伦致命信号11,android,android-ndk,gif,fatal-error,native-code,Android,Android Ndk,Gif,Fatal Error,Native Code,我正在尝试使用一些本地代码来创建GIF。 我使用paint绘制图像,创建一些笔划,单击save,然后将绘制的图像保存为JPG格式。当我单击CreateGIF时,它会获取所有图像并开始创建Gif。这是当我收到致命信号11时,应用程序重新启动 我使用本机代码,因此有崩溃的回溯: I/DEBUG(95): backtrace: I/DEBUG(95): #00 pc 00002a04 /lib/libgifflen.so (NeuQuant::learn()+239) I/DEBUG(95
I/DEBUG(95): backtrace:
I/DEBUG(95): #00 pc 00002a04 /lib/libgifflen.so (NeuQuant::learn()+239)
I/DEBUG(95): #01 pc 00002b9d /lib/libgifflen.so (NeuQuant::quantise(DIB*, DIB*, int, int, int)+84)
I/DEBUG(95): #02 pc 00002d41 lib/libgifflen.so (Java_com_stay_gif_GifEncoder_addFrame+208)
I/DEBUG(95): #03 pc 0001deb0 /system/lib/libdvm.so (dvmPlatformInvoke+112)
I/DEBUG(95): #04 pc 0004d103 /system/lib/libdvm.so (dvmCallJNIMethod(unsigned int const*, JValue*, Method const*, Thread*)+394)
I/DEBUG(95): #05 pc 0004f21f /system/lib/libdvm.so (dvmResolveNativeMethod(unsigned int const*, JValue*, Method const*, Thread*)+174)
I/DEBUG(95): #06 pc 000272e0 /system/lib/libdvm.so
I/DEBUG(95): #07 pc 0002bbe8 /system/lib/libdvm.so (dvmInterpret(Thread*, Method const*, JValue*)+180)
I/DEBUG(95): #08 pc 0005fb37 /system/lib/libdvm.so (dvmInvokeMethod(Object*, Method const*, ArrayObject*, ArrayObject*, ClassObject*, bool)+374)
I/DEBUG(95): #09 pc 000670e5 /system/lib/libdvm.so
I/DEBUG(95): #10 pc 000272e0 /system/lib/libdvm.so
I/DEBUG(95): #11 pc 0002bbe8 /system/lib/libdvm.so (dvmInterpret(Thread*, Method const*, JValue*)+180)
I/DEBUG(95): #12 pc 0005f871 /system/lib/libdvm.so (dvmCallMethodV(Thread*, Method const*, Object*, bool, JValue*, std::__va_list)+272)
I/DEBUG(95): #13 pc 000496f3 /system/lib/libdvm.so
I/DEBUG(95): #14 pc 00048581 /system/lib/libandroid_runtime.so
I/DEBUG(95): #15 pc 00049637 /system/lib/libandroid_runtime.so (android::AndroidRuntime::start(char const*, char const*)+390)
I/DEBUG(95): #16 pc 00000dcf /system/bin/app_process
崩溃的代码:
void NeuQuant::learn()
{
int i,j,b,g,r;
int radius,rad,alpha,step,delta,samplepixels;
//unsigned char *p;
int *p;
unsigned char *lim;
alphadec = 30 + ((samplefac-1)/3);
p = (int*)thepicture;
lim = thepicture + lengthcount;
samplepixels = lengthcount/samplefac;
delta = samplepixels/ncycles;
alpha = initalpha;
radius = initradius;
rad = radius >> radiusbiasshift;
if (rad <= 1) rad = 0;
for (i=0; i<rad; i++)
radpower[i] = alpha*(((rad*rad - i*i)*radbias)/(rad*rad));
//fprintf(stderr,"beginning 1D learning: initial radius=%d\n", rad);
sprintf(s, "samplepixels = %d, rad = %d, a=%d, ad=%d, d=%d", samplepixels, rad, alpha, alphadec, delta);
__android_log_write(ANDROID_LOG_VERBOSE, "gifflen",s);
if ((lengthcount%prime1) != 0) step = prime1;
else {
if ((lengthcount%prime2) !=0) step = prime2;
else {
if ((lengthcount%prime3) !=0) step = prime3;
else step = prime4;
}
}
i = 0;
while (i < samplepixels)
{
/* b = p[0] << netbiasshift;
g = p[1] << netbiasshift;
r = p[2] << netbiasshift;*/
b = (((*p)) & 0xff) << netbiasshift;
g = (((*p) >> 8) & 0xff) << netbiasshift;
r = (((*p) >> 16) & 0xff) << netbiasshift;
j = contest(b, g, r);
altersingle(alpha,j,b,g,r); //these crashes
if (rad) alterneigh(rad,j,b,g,r); // alter neighbours
p += step;
if (p >= (int *)lim) p -= lengthcount;
i++;
if (i%delta == 0)
{
alpha -= alpha / alphadec;
radius -= radius / radiusdec;
rad = radius >> radiusbiasshift;
if (rad <= 1) rad = 0;
for (j=0; j<rad; j++)
radpower[j] = alpha*(((rad*rad - j*j)*radbias)/(rad*rad));
}
}
//sprintf(s, "final alpha = %f", ((float)alpha)/initalpha);
// __android_log_write(ANDROID_LOG_VERBOSE, "gifflen",s);
}
void NeuQuant::learn()
{
int i,j,b,g,r;
整数半径、rad、alpha、步长、delta、采样像素;
//无符号字符*p;
int*p;
无符号字符*lim;
alphadec=30+((样本FAC-1)/3);
p=(int*)图片;
lim=图片+长度计数;
samplepixels=长度计数/samplefac;
delta=采样像素/n周期;
α=初始α;
半径=初始半径;
rad=半径>>半径偏差移位;
如果(radI发生变化:
if (p >= (int *)lim)
p -= lengthcount;
致:
现在它似乎起作用了。可能p
变成了无效的引用,由于指针算法的原因导致分段错误。我如何解决这个问题?有没有办法检查“p”如果停止无效或类似的话?这种方法是不正确的。它将输出GIF的大小放大了30%。我找到了另一个好的解决方案。我只是从原始文件中复制方法体learn()
,然后粘贴到gifflenNeuQuant::learn())
我刚刚用上面的代码和您的代码做了一些测试。我看不出GIF大小有什么不同。最小的GIF大约为1000 KB,最大的在两种情况下都在2500 KB左右。我尝试为测试绘制相同的图像,因此大小差异最大为10%以上/更小。你是我的救世主。谢谢!
if (p >= (unsigned int *)lim)
p = (unsigned int*)thepicture;