Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

java.lang.ArrayIndexOutOfBoundsException when getting image array

When I try to run the following code

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 Code

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

i get the following error

java.lang.ArrayIndexOutOfBoundsException

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

I am trying to use functions of libfprint library for image processing. I have return JNI code for accessing that library functions and also I have returned the object from JNI to java layer but at that line I am getting the error.

like image 908
rachana Avatar asked Nov 12 '22 23:11

rachana


1 Answers

Just a thought here. You are hard-coding the length variable to 327680 or 81408 . Instead try setting that to imgbytes.length

l = imgbytes.length;

Also please modify the code as below and try again :

     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 !!
like image 116
Zenil Avatar answered Nov 14 '22 22:11

Zenil