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.

rachana
  • 3,344
  • 7
  • 30
  • 49

1 Answers1

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 !!
Zenil
  • 1,491
  • 3
  • 12
  • 21
  • I have tried to set `imgbytes.length` but it still showing the error – rachana Aug 22 '13 at 05:41
  • 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 !) – Zenil Aug 22 '13 at 07:21
  • 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 – Zenil Aug 22 '13 at 07:24
  • 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 – Zenil Aug 22 '13 at 07:28
  • I have tried with your suggested changes.`imgbytes.length` gives image length as 81402 and also no exception after `bos.flush()`. – rachana Aug 22 '13 at 07:46
  • In that case you have to now debug the jni method. I see the argument jobject imgObject in your JNI method..Since you are passing a byte[] shouldn't the JNI argument be of type jbyteArray ? Here's an example where a byte[] is being passed : http://stackoverflow.com/questions/3421300/passing-a-byte-in-java-to-a-function-in-c-through-jni-how-to-use-jarraybyte – Zenil Aug 22 '13 at 07:57
  • Thank you for your suggestion.But I am not passing the byte array of image. – rachana Aug 22 '13 at 11:54
  • Got it..I think you have to share rest of the JNI code to debug this..Can you try putting printf() before calling each major operation and see where it fails .. – Zenil Aug 22 '13 at 12:35