5

Quando provo ad eseguire il seguente codice dijava.lang.ArrayIndexOutOfBoundsException quando ottiene un'immagine serie

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 Codice

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

ottengo il seguente errore

java.lang.ArrayIndexOutOfBoundsException 

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

Sto cercando di utilizzare le funzioni di libfprint libreria per l'elaborazione delle immagini. Ho restituito il codice JNI per accedere a quelle funzioni della libreria e inoltre ho restituito l'oggetto da JNI a livello java ma su quella riga sto ricevendo l'errore.

+0

aggiungere il codice della classe 'fp_image_data' e il codice JNI prega –

+0

@ c.s. OK, ho modificato la mia domanda. – rachana

+0

Dove sono gli array 'binarizzati []', 'data []' inizializzati? –

risposta

1

Solo un pensiero qui. Si sta codificando a fondo la variabile di lunghezza su 327680 o 81408. Invece provare l'impostazione che a imgbytes.length

l = imgbytes.length; 

Inoltre si prega di modificare il codice come sottostante e riprovare:

 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

Ho provato a impostare 'imgbytes.length' ma mostra ancora l'errore – rachana

+0

È possibile stampare lo stacktrace completo di eccezione? Trovo sospetto che una chiamata JNI stia generando un'eccezione java. Inoltre, qual è il valore effettivo di imgbytes.length? (Voglio solo confermare che non è 0!) – Zenil

+0

Inoltre, durante la lettura del buffer, il blocco catch ignora eventuali eccezioni . Si prega di fare un e.printStacktrace() lì per assicurarsi che non si verifichi alcun errore – Zenil

Problemi correlati