2013-08-06 20 views
5

Tôi đang cố gắng sử dụng một số Mã gốc để tạo Gifs. Tôi vẽ hình ảnh bằng sơn, tạo một vài nét, nhấp vào lưu và hình ảnh được vẽ sẽ được lưu vào định dạng JPG. khi tôi nhấp vào tạo Gif, nó sẽ chụp tất cả hình ảnh và bắt đầu tạo gif. Đây là khi tôi nhận được tín hiệu Fatal 11 và ứng dụng khởi động lại.Gifflen Fatal Signal 11

tôi sử dụng mã gốc vì vậy tôi có một vết lùi của vụ tai nạn:

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 

Mã, nơi nó bị treo:

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); 
} 

Thx để Log tôi phát hiện ra rằng các lỗi xảy ra trong NeuQuant :: học(), đã làm một số debugs và nó bị treo trên đường dây này chính xác b = (((* p)) & 0xff) < < netbiasshift ;.

Sự cố không xảy ra luôn, đôi khi tôi nhận được gif và mọi thứ hoạt động, nhưng đôi khi nó bị lỗi tại b = (((* p)) & 0xff) < < netbiasshift ;.

Tôi đã thực hiện một số sửa lỗi khác và tôi phát hiện ra rằng khi nó gặp sự cố trên b = (((* p)) & 0xff) < < netbiasshift; nó không sụp đổ khi nó đi vào lần đầu tiên, nó bị treo như sau 30 séc của b = (((* p)) & 0xff) < < netbiasshift ;.

Bất cứ ai biết những gì có thể là vấn đề?

+0

Có lẽ 'p' trở thành tham chiếu không hợp lệ, dẫn đến lỗi phân đoạn do số học con trỏ của bạn. – auselen

+0

Làm cách nào để khắc phục sự cố này? Có cách nào để kiểm tra "p" và nếu dừng không hợp lệ hoặc một cái gì đó như thế? –

Trả lời

4

tôi đã thay đổi:

if (p >= (int *)lim) 
    p -= lengthcount; 

tới:

if (p >= (unsigned int *)lim) 
    p = (unsigned int*)thepicture; 

Và có vẻ như để làm việc bây giờ.

+0

Cách tiếp cận này không chính xác. Nó phóng to kích thước của GIF đầu ra trên 30%. Tôi tìm một giải pháp tốt khác. Tôi chỉ sao chép nội dung của phương thức 'learn()' từ bản gốc [NeuQuant algorythm] (http://members.ozemail.com.au/~dekker/NEUQUANT.C) và dán vào gifflen 'NeuQuant :: learn()' – danik

+0

Tôi chỉ làm một số xét nghiệm với mẫu mã bạn và mã ở trên. Tôi không thấy sự khác biệt về kích thước GIF. GIF nhỏ nhất là khoảng 1000 KB, lớn nhất khoảng 2500KB trong cả hai tình huống. Đã cố gắng vẽ các hình ảnh tương tự cho các bài kiểm tra để chênh lệch kích thước cao hơn tối đa 10%/nhỏ hơn. –

+0

Bạn là vị cứu tinh của tôi. CẢM ƠN! –

Các vấn đề liên quan