comparison bindings/java/ext/libAudioDB_JNI.c @ 729:a9978a6d0bb3

* Initial code to handle querying by datum * Created Datum class (without key var) * Added toString to Result for quick debug * Needs plenty of testing!
author mas01mj
date Tue, 03 Aug 2010 17:08:54 +0000
parents d3407d1e2f57
children
comparison
equal deleted inserted replaced
728:d3407d1e2f57 729:a9978a6d0bb3
11 #define ADB_HEADER_FLAG_L2NORM 0x1 11 #define ADB_HEADER_FLAG_L2NORM 0x1
12 #define ADB_HEADER_FLAG_POWER 0x4 12 #define ADB_HEADER_FLAG_POWER 0x4
13 #define ADB_HEADER_FLAG_TIMES 0x20 13 #define ADB_HEADER_FLAG_TIMES 0x20
14 #define ADB_HEADER_FLAG_REFERENCES 0x40 14 #define ADB_HEADER_FLAG_REFERENCES 0x40
15 15
16 double get_int_val(JNIEnv *env, jclass classValue, jobject objectValue, char* field, int defaultValue) 16 jdoubleArray get_double_array(JNIEnv *env, jclass classValue, jobject objectValue, char* field)
17 {
18 jfieldID fid = (*env)->GetFieldID(env, classValue, field, "[D");
19 if(fid == NULL) return NULL;
20 jdoubleArray arr = (*env)->GetObjectField(env, objectValue, fid);
21 return arr;
22 }
23
24 int get_int_val(JNIEnv *env, jclass classValue, jobject objectValue, char* field, int defaultValue)
17 { 25 {
18 jfieldID fid = (*env)->GetFieldID(env, classValue, field, "I"); 26 jfieldID fid = (*env)->GetFieldID(env, classValue, field, "I");
19 if(fid == NULL) return defaultValue; 27 if(fid == NULL) return defaultValue;
20 int val = (*env)->GetIntField(env, objectValue, fid); 28 int val = (*env)->GetIntField(env, objectValue, fid);
21 return (val ? val : defaultValue); 29 return (val ? val : defaultValue);
307 (*env)->DeleteLocalRef(env, resultClass); 315 (*env)->DeleteLocalRef(env, resultClass);
308 (*env)->DeleteLocalRef(env, vectorClass); 316 (*env)->DeleteLocalRef(env, vectorClass);
309 return vector; 317 return vector;
310 } 318 }
311 319
312 JNIEXPORT jobject JNICALL Java_org_omras2_AudioDB_audiodb_1query_1by_1key(JNIEnv *env, jobject adbobj, jstring key, jobject queryObject) 320 JNIEXPORT jobject JNICALL Java_org_omras2_AudioDB_audiodb_1query(JNIEnv *env, jobject adbobj, jstring key, jobject queryObject)
313 { 321 {
314 adb_t* handle = get_handle(env, adbobj); 322 adb_t* handle = get_handle(env, adbobj);
315 323
316 if(!handle) 324 if(!handle)
317 return; 325 return;
318 326
319 const char* keyStr = (*env)->GetStringUTFChars(env, key, NULL); 327 jclass queryClass = (*env)->GetObjectClass(env, queryObject);
320 if (keyStr == NULL) 328
321 return; 329 jclass datumClass = (*env)->FindClass(env, "org/omras2/Datum");
322 330 jfieldID datumFid = (*env)->GetFieldID(env, queryClass, "datum", "Lorg/omras2/Datum;");
331 if(datumFid == NULL) return;
332
333 jobject datumObject = (*env)->GetObjectField(env, queryObject, datumFid);
334 if(datumObject == NULL) return;
335
323 adb_query_spec_t* spec = (adb_query_spec_t *)malloc(sizeof(adb_query_spec_t)); 336 adb_query_spec_t* spec = (adb_query_spec_t *)malloc(sizeof(adb_query_spec_t));
324 spec->qid.datum = (adb_datum_t *)malloc(sizeof(adb_datum_t)); 337 spec->qid.datum = (adb_datum_t *)malloc(sizeof(adb_datum_t));
325 adb_query_results_t* result = (adb_query_results_t *)malloc(sizeof(adb_query_results_t)); 338 adb_query_results_t* result = (adb_query_results_t *)malloc(sizeof(adb_query_results_t));
326 339
327 // As in python bindings 340 // As in python bindings
328 spec->refine.flags = 0; 341 spec->refine.flags = 0;
329
330 jclass queryClass = (*env)->GetObjectClass(env, queryObject);
331 342
332 spec->qid.sequence_length = get_int_val(env, queryClass, queryObject, "seqLength", 16); 343 spec->qid.sequence_length = get_int_val(env, queryClass, queryObject, "seqLength", 16);
333 spec->qid.sequence_start = get_int_val(env, queryClass, queryObject, "seqStart", 0); 344 spec->qid.sequence_start = get_int_val(env, queryClass, queryObject, "seqStart", 0);
334 spec->params.npoints = get_int_val(env, queryClass, queryObject, "npoints", 1); 345 spec->params.npoints = get_int_val(env, queryClass, queryObject, "npoints", 1);
335 spec->params.ntracks = get_int_val(env, queryClass, queryObject, "ntracks", 100); 346 spec->params.ntracks = get_int_val(env, queryClass, queryObject, "ntracks", 100);
439 450
440 spec->qid.datum->data = NULL; 451 spec->qid.datum->data = NULL;
441 spec->qid.datum->power = NULL; 452 spec->qid.datum->power = NULL;
442 spec->qid.datum->times = NULL; 453 spec->qid.datum->times = NULL;
443 454
444 int ok = audiodb_retrieve_datum(handle, keyStr, spec->qid.datum); 455 if (key != NULL)
445 if(ok != 0) { 456 {
446 return; 457 const char* keyStr = (*env)->GetStringUTFChars(env, key, NULL);
447 } 458 if(keyStr != NULL)
459 {
460 int ok = audiodb_retrieve_datum(handle, keyStr, spec->qid.datum);
461 if(ok != 0)
462 return;
463 }
464 }
465 else
466 {
467 jdoubleArray data = get_double_array(env, datumClass, datumObject, "data");
468 jdouble *dataBody = (*env)->GetDoubleArrayElements(env, data, 0);
469 spec->qid.datum->data = dataBody;
470
471 jdoubleArray power = get_double_array(env, datumClass, datumObject, "power");
472 jdouble *powerBody = (*env)->GetDoubleArrayElements(env, power, 0);
473 spec->qid.datum->power = powerBody;
474
475 jdoubleArray times = get_double_array(env, datumClass, datumObject, "times");
476 jdouble *timesBody = (*env)->GetDoubleArrayElements(env, times, 0);
477 spec->qid.datum->times = timesBody;
478
479 spec->qid.datum->nvectors = get_int_val(env, datumClass, datumObject, "nvectors", 0);
480 spec->qid.datum->dim = get_int_val(env, datumClass, datumObject, "dim", 0);
481
482 (*env)->ReleaseDoubleArrayElements(env, data, dataBody, 0);
483 (*env)->ReleaseDoubleArrayElements(env, power, powerBody, 0);
484 (*env)->ReleaseDoubleArrayElements(env, times, timesBody, 0);
485 }
486
448 result = audiodb_query_spec(handle, spec); 487 result = audiodb_query_spec(handle, spec);
449 488
450 if(result == NULL) { 489 if(result == NULL) {
451 return; 490 return;
452 } 491 }
453 (*env)->DeleteLocalRef(env, queryClass); 492 (*env)->DeleteLocalRef(env, queryClass);
493 (*env)->DeleteLocalRef(env, datumClass);
494
454 495
455 return build_results(env, result); 496 return build_results(env, result);
456 } 497 }
457 498