Mercurial > hg > audiodb
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 |