5

Kiedy próbuję uruchomić następujący kodjava.lang.ArrayIndexOutOfBoundsException gdy coraz tablicę obrazu

SampleRun.java

public class SampleRun { 

    public static void main(String[] args) { 

     JlibFprint jlibfprint = new JlibFprint(); 
     JlibFprint.fp_image_data fpimg = new JlibFprint.fp_image_data(); 
     JlibFprint.fp_image_data fpimg1 = new JlibFprint.fp_image_data() ; 

     try 
     { 
      File file = new File("/some/path/Capture.bin"); //reads the binary image file 

      FileInputStream fin = new FileInputStream(file); 
      ByteArrayOutputStream bos = new ByteArrayOutputStream(); 
     byte[] buff = new byte[1024]; 
     try 
     { 
      for(int i;(i = fin.read(buff)) !=-1;){ 
       bos.write(buff,0,i);     
      } 
     } 
     catch (Exception e) { 
      // TODO: handle exception 

     } 
     byte[] imgbytes = bos.toByteArray(); 
      if(file.length() == 327680) 
     { 
      h=620; 
      w=512; 
      l=327680; 
     } 
     else 
     { 
      h=320; 
      w=256; 
      l=81408; 
     } 
     fpimg.setData(imgbytes); 
     fpimg.setHeight(h); 
     fpimg.setWidth(w); 
     fpimg.setLength(l); 

      try { 
      fpimg1 = JlibFprint.binary_image(fpimg);  //error at this line 
      //return the object of image structure from the JNI code 
        System.out.println("image binarized\n"); 
     } catch (ArrayIndexOutOfBoundsException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 

     } 
     catch (Exception e) 
     { 
      e.printStackTrace(); 
     } 
    } 
} 

JlibFprint.java

public class JlibFprint { 

    static { 
     System.loadLibrary("JlibFprint_jni"); 
    }  

    static public class fp_image_data implements java.io.Serializable{ 

     int width; 
    int height; 
    int length; 
    byte data[]; 


    public int getWidth() { 
     return width; 
    } 

    public void setWidth(int width) { 
     this.width = width; 
    } 

    public int getHeight() { 
     return height; 
    } 

    public void setHeight(int height) { 
     this.height = height; 
    } 

    public int getLength() { 
     return length; 
    } 

    public void setLength(int length) { 
     this.length = length; 
    } 

    public byte[] getData() { 
     return data; 
    } 

    public void setData(byte[] data) { 
     this.data = data; 
    } 



    public fp_image_data() 
    {} 

    public void clear() 
    { 
     width = 0; 
     height = 0; 
     length = 0; 
     for (int i = 0; i < data.length; i++) data[i] = 0; 
    } 
    } 

} 

JNI Kod

JNIEXPORT jobject JNICALL Java_jlibfprint_JlibFprint_binary_1image(JNIEnv *env, jclass jcls,jobject imgobj) 
{ 
    struct fp_img img; 
    struct fp_img *imgptr; 
    imgptr = &img; 
    jfp2cfp(env,imgobj,imgptr); // this function gets the value from java 
    fp_init(); 

    imgptr = fp_img_binarize(imgptr); 

    cfp2jfp(env, imgobj, imgptr); //this function sets the value to hava 

    fp_exit(); 
    printf("\nlibrary closed..........."); 
    return imgobj; 
} 

otrzymuję następujący błąd

java.lang.ArrayIndexOutOfBoundsException 

    at jlibfprint.JlibFprint.binary_image(Native Method) 
    at jlibfprint.SampleRun.main(SampleRun.java:23) 

Próbuję użyć funkcji libfprint biblioteki do przetwarzania obrazu. Zwróciłem kod JNI, aby uzyskać dostęp do tych funkcji bibliotecznych, a także zwróciłem obiekt z JNI do warstwy Javy, ale w tym wierszu otrzymuję błąd.

+0

Dodaj kod klasy 'fp_image_data' i kod JNI proszę –

+0

@ c.s. OK, zredagowałem moje pytanie. – rachana

+0

Gdzie są tablice 'binaryzowane []', 'dane []' zainicjalizowane? –

Odpowiedz

1

Po prostu myśl tutaj. Twarde kodowanie zmiennej długości do 327680 lub 81408. Zamiast tego spróbuj ustawić, że do imgbytes.length

l = imgbytes.length; 

Także proszę zmodyfikować kod jak poniżej i spróbuj jeszcze raz:

 byte[] buff = new byte[1024]; 
      try 
      { 
       for(int i;(i = fin.read(buff)) !=-1;){ 
        bos.write(buff,0,i);     
       } 
       bos.flush(); //this is important 
      } 
      catch (Exception e) { 
       e.printStackTrace();//see if any error happened here 

      } 

     byte[] imgbytes = bos.toByteArray(); 
     System.out.println(imgbytes.len);//Verify that it has some data and its length is greater than 0 !! 
+0

Próbowałem ustawić 'imgbytes.length', ale nadal pokazuje błąd – rachana

+0

Czy można wydrukować pełny stos stosu wyjątków? Uważam za podejrzane, że wywołanie JNI rzuca wyjątek java. Również jaka jest rzeczywista wartość imgbytes.length? (Chcę tylko potwierdzić, że nie jest 0!) – Zenil

+0

Również podczas odczytu do buffa blok catch ignoruje wszelkie wyjątki . Wykonaj polecenie e.printStacktrace(), aby upewnić się, że nie wystąpił błąd. – Zenil