Mercurial > hg > audiodb
diff 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 |
line wrap: on
line diff
--- a/bindings/java/ext/libAudioDB_JNI.c Mon Jul 26 16:19:56 2010 +0000 +++ b/bindings/java/ext/libAudioDB_JNI.c Tue Aug 03 17:08:54 2010 +0000 @@ -13,7 +13,15 @@ #define ADB_HEADER_FLAG_TIMES 0x20 #define ADB_HEADER_FLAG_REFERENCES 0x40 -double get_int_val(JNIEnv *env, jclass classValue, jobject objectValue, char* field, int defaultValue) +jdoubleArray get_double_array(JNIEnv *env, jclass classValue, jobject objectValue, char* field) +{ + jfieldID fid = (*env)->GetFieldID(env, classValue, field, "[D"); + if(fid == NULL) return NULL; + jdoubleArray arr = (*env)->GetObjectField(env, objectValue, fid); + return arr; +} + +int get_int_val(JNIEnv *env, jclass classValue, jobject objectValue, char* field, int defaultValue) { jfieldID fid = (*env)->GetFieldID(env, classValue, field, "I"); if(fid == NULL) return defaultValue; @@ -309,17 +317,22 @@ return vector; } -JNIEXPORT jobject JNICALL Java_org_omras2_AudioDB_audiodb_1query_1by_1key(JNIEnv *env, jobject adbobj, jstring key, jobject queryObject) +JNIEXPORT jobject JNICALL Java_org_omras2_AudioDB_audiodb_1query(JNIEnv *env, jobject adbobj, jstring key, jobject queryObject) { adb_t* handle = get_handle(env, adbobj); if(!handle) return; - const char* keyStr = (*env)->GetStringUTFChars(env, key, NULL); - if (keyStr == NULL) - return; + jclass queryClass = (*env)->GetObjectClass(env, queryObject); + jclass datumClass = (*env)->FindClass(env, "org/omras2/Datum"); + jfieldID datumFid = (*env)->GetFieldID(env, queryClass, "datum", "Lorg/omras2/Datum;"); + if(datumFid == NULL) return; + + jobject datumObject = (*env)->GetObjectField(env, queryObject, datumFid); + if(datumObject == NULL) return; + adb_query_spec_t* spec = (adb_query_spec_t *)malloc(sizeof(adb_query_spec_t)); spec->qid.datum = (adb_datum_t *)malloc(sizeof(adb_datum_t)); adb_query_results_t* result = (adb_query_results_t *)malloc(sizeof(adb_query_results_t)); @@ -327,8 +340,6 @@ // As in python bindings spec->refine.flags = 0; - jclass queryClass = (*env)->GetObjectClass(env, queryObject); - spec->qid.sequence_length = get_int_val(env, queryClass, queryObject, "seqLength", 16); spec->qid.sequence_start = get_int_val(env, queryClass, queryObject, "seqStart", 0); spec->params.npoints = get_int_val(env, queryClass, queryObject, "npoints", 1); @@ -441,16 +452,46 @@ spec->qid.datum->power = NULL; spec->qid.datum->times = NULL; - int ok = audiodb_retrieve_datum(handle, keyStr, spec->qid.datum); - if(ok != 0) { - return; + if (key != NULL) + { + const char* keyStr = (*env)->GetStringUTFChars(env, key, NULL); + if(keyStr != NULL) + { + int ok = audiodb_retrieve_datum(handle, keyStr, spec->qid.datum); + if(ok != 0) + return; + } } + else + { + jdoubleArray data = get_double_array(env, datumClass, datumObject, "data"); + jdouble *dataBody = (*env)->GetDoubleArrayElements(env, data, 0); + spec->qid.datum->data = dataBody; + + jdoubleArray power = get_double_array(env, datumClass, datumObject, "power"); + jdouble *powerBody = (*env)->GetDoubleArrayElements(env, power, 0); + spec->qid.datum->power = powerBody; + + jdoubleArray times = get_double_array(env, datumClass, datumObject, "times"); + jdouble *timesBody = (*env)->GetDoubleArrayElements(env, times, 0); + spec->qid.datum->times = timesBody; + + spec->qid.datum->nvectors = get_int_val(env, datumClass, datumObject, "nvectors", 0); + spec->qid.datum->dim = get_int_val(env, datumClass, datumObject, "dim", 0); + + (*env)->ReleaseDoubleArrayElements(env, data, dataBody, 0); + (*env)->ReleaseDoubleArrayElements(env, power, powerBody, 0); + (*env)->ReleaseDoubleArrayElements(env, times, timesBody, 0); + } + result = audiodb_query_spec(handle, spec); if(result == NULL) { return; } (*env)->DeleteLocalRef(env, queryClass); + (*env)->DeleteLocalRef(env, datumClass); + return build_results(env, result); }