# include "com_*_common_*.h"
# include "log*.h"
//抛出带参数的自定义异常
void throw_exception(JNIEnv * env,int code){
jclass exception_class = env->FindClass("com/*/*/*");
jmethodID method_id = env->GetMethodID(exception_class, "<init>", "(I)V");
jthrowable obj =(jthrowable) env->NewObject(exception_class, method_id, code);
env->Throw(obj);
}
JNIEXPORT jbyteArray JNICALL Java_com_*_*_*_getTemplate(
JNIEnv * env, jclass clazz, jint template_id) {
int ret = 1;
LOGD("template_id = %d\n", template_id);
if((ret = get_template(template_id))!= 1)
{
LOGE("Error:ret = %d,lineNumber = %d,descriptor: Get Template failed.",ret,__LINE__);
throw_exception(env, ret);
return 0;
}
LOGD("template_id = %d is captured.", template_id);
jbyte *by = (jbyte*)p_image;
jbyteArray jarray = env->NewByteArray(SIZEOF_TEMPLATE);
env->SetByteArrayRegion(jarray, 0, SIZEOF_TEMPLATE, by);
return jarray;
}
JNIEXPORT jint JNICALL Java_com_*_*_*_openDeviceNative(
JNIEnv * env, jclass clazz, jstring file_path) {
char* save_file_path;
int ret = com_*_*_*_EXE_SUCCESS;
save_file_path = (char*) env->GetStringUTFChars(file_path, 0);
LOGD("file_path = %s", save_file_path);
ret = device_open(save_file_path);
LOGD("device_open:ret = %d", ret);
return ret;
}
JNIEXPORT jint JNICALL Java_com_*_*_*_closeDeviceNative(
JNIEnv * env, jclass clazz) {
int ret = com_*_*_*_EXE_SUCCESS;
LOGD("execute closeDeviceNative.");
ret = device_close();
LOGD("device_close:ret = %d",ret);
return ret;
}
JNIEXPORT jbyteArray JNICALL Java_com_*_*_*_getDeviceInfoNative(
JNIEnv * env, jclass clazz) {
int ret = com_*_*_*_EXE_SUCCESS;
char p_image[1024] = { 0 };
LOGD("Get device descriptor start.\n");
if((ret = get_desc(p_image))!=com_*_*_*_EXE_SUCCESS)
{
LOGE("Error:ret = %d,lineNumber = %d,descriptor: Get device descriptor failed.",ret,__LINE__);
throw_exception(env, ret);
}
LOGD("Get device descriptor success.\n");
jbyte *by = (jbyte*)p_image;
jbyteArray jarray = env->NewByteArray(1024);
env->SetByteArrayRegion(jarray, 0, 1024, by);
return jarray;
}
JNIEXPORT jbyteArray JNICALL Java_com_*_*_*_captureImageNative(
JNIEnv * env, jclass clazz, jint type, jint time_out) {
int ret = com_*_*_*_EXE_SUCCESS;
unsigned char p_image[IMAGE_Y*IMAGE_X];
int i=0;
LOGD("%d Get image data,type = %d, time_out = %d",__LINE__,type,time_out);
if((ret = get_image(type, p_image, time_out))!=com_*_*_*_EXE_SUCCESS)
{
LOGE("Error:ret = %d,lineNumber = %d,descriptor: Get image data failed.",ret,__LINE__);
throw_exception(env, ret);
}
LOGD("%d:Get image data success,type = %d, time_out = %d -----",__LINE__,type,time_out);
jbyte *by = (jbyte*)p_image;
jbyteArray myjarray = env->NewByteArray(IMAGE_Y*IMAGE_X);
env->SetByteArrayRegion(myjarray, 0, IMAGE_Y*IMAGE_X, by);
LOGD("%d:Get image data success,type = %d, time_out = %d -----",__LINE__,type,time_out);
return myjarray;
}
JNIEXPORT jobject JNICALL Java_com_*_*_*_enrollFingerNative(
JNIEnv * env, jclass clazz, jint template_id, jint inc_press,
jint time_out) {
int ret = com_*_*_*_EXE_SUCCESS;
unsigned char p_image[MAX_WIDTH*MAX_HEIGHT] = { 0 };
unsigned char p_template[SIZEOF_TEMPLATE] = {0};
LOGD("enroll finger data start.");
if((ret= enroll_finger(template_id, inc_press, p_template, p_image, time_out))!=com_*_*_*_EXE_SUCCESS ){
LOGE("Error:ret = %d,lineNumber = %d,descriptor: enroll finger data failed.",ret,__LINE__);
throw_exception(env, ret);
}
LOGD("enroll finger data success.");
jclass cls = env->FindClass("com/*/*/FingerInfo");
jmethodID id = env->GetMethodID(cls, "<init>", "()V");
jobject paramOut = env->NewObjectA(cls, id, 0);
jbyte *by = (jbyte*)p_template;
jbyteArray jarray = env->NewByteArray(SIZEOF_TEMPLATE);
env->SetByteArrayRegion(jarray, 0, SIZEOF_TEMPLATE, by);
jfieldID template_data = env->GetFieldID(cls, "template", "[B");
env->SetObjectField(paramOut, template_data, jarray);
jbyte *image_data_by = (jbyte *)p_image;
jbyteArray image_data_array = env->NewByteArray(MAX_WIDTH*MAX_HEIGHT);
env->SetByteArrayRegion(image_data_array, 0, MAX_WIDTH*MAX_HEIGHT , image_data_by);
jfieldID image_data = env->GetFieldID(cls, "imageBitmap", "[B");
env->SetObjectField(paramOut, image_data, image_data_array);
return paramOut;
}
JNIEXPORT jint JNICALL Java_com_*_*_*_setTemplateNative(
JNIEnv * env, jclass clazz, jint template_id,
jbyteArray template_data) {
jint ret = com_*_*_*_EXE_SUCCESS;
jbyte p_template[SIZEOF_TEMPLATE] = {0} ;
env->GetByteArrayRegion(template_data, 0, SIZEOF_TEMPLATE, p_template);
LOGD("set template start.");
ret = set_template(template_id, (U8 *) p_template);
LOGD("set template end. ret = %d",ret);
return ret;
}
JNIEXPORT jint JNICALL Java_com_*_*_*_delTemplateNative(
JNIEnv * env, jclass clazz, jint template_id) {
jint ret = com_*_*_*_EXE_SUCCESS;
LOGD("delete template start.");
ret = del_template(template_id);
LOGD("delete template end. ret = %d",ret);
return ret;
}
JNIEXPORT jobject JNICALL Java_com_*_*_*_getTemplateTableNative(
JNIEnv * env, jclass clazz) {
int ret = com_*_*_*_EXE_SUCCESS;
unsigned char template_table[SIZEOF_TEMPLATE * MAX_FP_COUNT]={0};
LOGD("get template table start.");
if((ret = get_template_table(template_table)) < 0){
LOGE("Error:ret = %d,lineNumber = %d,descriptor: get template table data failed.",ret,__LINE__);
throw_exception(env, ret);
}
LOGD("get template table end.");
jclass cls = env->FindClass("com/*/*/TemplateList");
jmethodID id = env->GetMethodID(cls, "<init>", "()V");
jobject paramOut = env->NewObjectA(cls, id, 0);
jbyte *by = (jbyte *)template_table;
jbyteArray jarray = env->NewByteArray(SIZEOF_TEMPLATE * MAX_FP_COUNT);
env->SetByteArrayRegion(jarray, 0, SIZEOF_TEMPLATE * MAX_FP_COUNT , by);
jfieldID template_list = env->GetFieldID(cls, "templateList", "[B");
env->SetObjectField(paramOut, template_list, jarray);
jfieldID template_count = env->GetFieldID(cls, "templateCount", "I");
env->SetIntField(paramOut, template_count, ret);
return paramOut;
}
JNIEXPORT jint JNICALL Java_com_*_*_*_searchWithFingerNative(
JNIEnv * env, jclass clazz, jint time_out) {
jint ret = com_*_*_*_EXE_SUCCESS;
LOGD("search with finger start.");
ret = search_with_finger(time_out);
LOGD("search with finger end.");
return ret;
}
JNIEXPORT jint JNICALL Java_com_*_*_*_searchWithTemplateNative(
JNIEnv * env, jclass clazz, jbyteArray template_data) {
jbyte p_template[SIZEOF_TEMPLATE] = {0} ;
jint ret = com_*_*_*_EXE_SUCCESS;
env->GetByteArrayRegion(template_data, 0, SIZEOF_TEMPLATE, p_template);
LOGD("search with template start.");
ret = search_with_template((unsigned char *)p_template);
LOGD("search with template end.");
return ret;
}