5

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.

7
  • Add the code of the fp_image_data class and the JNI code please Commented Aug 16, 2013 at 12:13
  • @c.s. OK,I have edited my question. Commented Aug 16, 2013 at 12:25
  • Where are the arrays binarized[], data[] initialized? Commented Aug 16, 2013 at 12:28
  • i have set that values in Sample.java file by calling set method. Commented Aug 16, 2013 at 12:31
  • You mean setData()? Please do not change the code while commenting. Where is this setData() called in your example? Commented Aug 16, 2013 at 12:45

1 Answer 1

1

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 !!
Sign up to request clarification or add additional context in comments.

8 Comments

I have tried to set imgbytes.length but it still showing the error
Can you print the full exception stacktrace ? I find it suspicious that a JNI call is throwing a java exception..Also what is the actual value of imgbytes.length ?(Just want to confirm its not 0 !)
Also when reading in to buff your catch block is ignoring any exceptions. Please do a e.printStacktrace() there to make sure no error is happening
Also you need to do a bos.flush() to make sure all the bytes are written to the internal buffer. I have put the code in my answer
I have tried with your suggested changes.imgbytes.length gives image length as 81402 and also no exception after bos.flush().
|

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.