オブジェクトをパラメータとしてコード usingJAVA
に渡したいというアプリケーションがあり、コードからusingにオブジェクトを受け取りたいと思っています。C
JNI
C
JAVA
JNI
JAVA側では、アプリケーションを作成し、以下に示すようにメソッドに渡しました
JlibFprint.fp_image_data fpimg = new JlibFprint.fp_image_data(); //object to be pass
//fp_image_data is the static inner class of the class JlibFprint
JlibFprint.fp_image_data fpimg1 = new JlibFprint.fp_image_data(); //received object
このオブジェクトは次のようなメソッドに渡されます
fpimg1 = JlibFprint.binary_image(fpimg);
メソッドの JNI コードは次のとおりです。
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);
fp_init();
imgptr = fp_img_binarize(imgptr);
cfp2jfp(env, imgobj, imgptr);
fp_exit();
return imgobj;
}
void jfp2cfp(JNIEnv* env, jobject obj, fp_img *fpd)
{
/* Determines all the fields of the object */
jclass fpClass = env->FindClass("jlibfprint/JlibFprint$fp_image_data");
jfieldID height;
jfieldID width;
jfieldID length;
jfieldID data;
jbyteArray dataArray;
height = env->GetFieldID(fpClass, "height", "I");
width = env->GetFieldID(fpClass, "width", "I");
length = env->GetFieldID(fpClass, "length", "I");
data = env->GetFieldID(fpClass, "data", "[B");
/* Starts to fill fpd */
fpd->height = env->GetIntField(obj, height);
fpd->width = env->GetIntField(obj, width);
fpd->length = env->GetIntField(obj, length);
printf("\n height :%d",fpd->height);
printf("\n width :%d",fpd->width);
printf("\n length :%d",fpd->length);
dataArray = static_cast<jbyteArray>(env->GetObjectField(obj, data));
env->GetByteArrayRegion(dataArray, 0, FP_PRINT_DATA_DATA_SIZE, (jbyte*)fpd->data);
}
void cfp2jfp(JNIEnv* env, jobject obj, fp_img* fpd)
{
/* Determines all the fields of the object */
jclass fpClass = env->FindClass("jlibfprint/JlibFprint$fp_image_data");
jfieldID height;
jfieldID width;
jfieldID length;
jfieldID data;
jbyteArray dataArray;
height = env->GetFieldID(fpClass, "height", "I");
width = env->GetFieldID(fpClass, "width", "I");
length = env->GetFieldID(fpClass, "length", "I");
data = env->GetFieldID(fpClass, "data", "[B");
/* Starts to fill the obj */
env->SetIntField(obj, height, fpd->height);
env->SetIntField(obj, width, fpd->width);
env->SetIntField(obj, length, fpd->length);
dataArray = env->NewByteArray(FP_PRINT_DATA_DATA_SIZE);
env->SetByteArrayRegion(dataArray, 0, FP_PRINT_DATA_DATA_SIZE, (jbyte*)fpd->data);
env->SetObjectField(obj, data, dataArray);
}
しかし、JAVA 側で JNI コードのこれらの関数から戻った後、メソッドは次のような例外を示します。
java.lang.ArrayIndexOutOfBoundsException
at jlibfprint.JlibFprint.binary_image(Native Method)
at jlibfprint.SampleRun.main(SampleRun.java:96)
つまり、オブジェクトが正しく処理されず、JNI レイヤーから何も返されません。しかし、正しいオブジェクトを返すために JNI コードで何を変更すればよいかわかりません。
解決策を教えてください。