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.
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 !!
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With