comparison bindings/java/ext/libAudioDB_JNI.c @ 727:4d9e4ff0a9cd

* Now produces results - a Vector of Result objects * Handles includeKeys / excludeKeys correctly
author mas01mj
date Mon, 26 Jul 2010 14:58:13 +0000
parents fe2282b9bfb0
children d3407d1e2f57
comparison
equal deleted inserted replaced
726:fe2282b9bfb0 727:4d9e4ff0a9cd
242 (*env)->DeleteLocalRef(env, statusClass); 242 (*env)->DeleteLocalRef(env, statusClass);
243 243
244 return result; 244 return result;
245 } 245 }
246 246
247 JNIEXPORT void JNICALL Java_org_omras2_AudioDB_audiodb_1query_1by_1key(JNIEnv *env, jobject adbobj, jstring key, jobject queryObject) 247 jobject build_results(JNIEnv *env, adb_query_results_t *result)
248 {
249 int i;
250 // Create a vector
251 jclass vectorClass = (*env)->FindClass(env, "java/util/Vector");
252 if(vectorClass == NULL) return;
253 jmethodID vectorCtor = (*env)->GetMethodID(env, vectorClass, "<init>", "()V");
254 if(vectorCtor == NULL) return;
255 jobject vector = (*env)->NewObject(env, vectorClass, vectorCtor);
256
257 jmethodID addElementMethod = (*env)->GetMethodID(env, vectorClass, "addElement", "(Ljava/lang/Object;)V");
258 if(addElementMethod == NULL) return;
259
260 jclass resultClass = (*env)->FindClass(env, "org/omras2/Result");
261 if(resultClass == NULL) return;
262 jmethodID resultCtor = (*env)->GetMethodID(env, resultClass, "<init>", "(Ljava/lang/String;DII)V");
263 if(resultCtor == NULL) return;
264
265 for(i=0; i<result->nresults; i++)
266 {
267 jstring keyStr = (*env)->NewStringUTF(env, result->results[i].ikey);
268 jobject resultObj = (*env)->NewObject(env, resultClass, resultCtor,
269 keyStr,
270 (double)(result->results[i].dist),
271 (int)(result->results[i].qpos),
272 (int)(result->results[i].ipos));
273
274 (*env)->CallObjectMethod(env, vector, addElementMethod, resultObj);
275
276 }
277 (*env)->DeleteLocalRef(env, resultClass);
278 (*env)->DeleteLocalRef(env, vectorClass);
279 return vector;
280 }
281
282 JNIEXPORT jobject JNICALL Java_org_omras2_AudioDB_audiodb_1query_1by_1key(JNIEnv *env, jobject adbobj, jstring key, jobject queryObject)
248 { 283 {
249 adb_t* handle = get_handle(env, adbobj); 284 adb_t* handle = get_handle(env, adbobj);
250 285
251 if(!handle) 286 if(!handle)
252 return; 287 return;
289 else if(strcmp(accType, "PER_TRACK") == 0) 324 else if(strcmp(accType, "PER_TRACK") == 0)
290 spec->params.accumulation = ADB_ACCUMULATION_PER_TRACK; 325 spec->params.accumulation = ADB_ACCUMULATION_PER_TRACK;
291 else if(strcmp(accType, "ONE_TO_ONE") == 0) 326 else if(strcmp(accType, "ONE_TO_ONE") == 0)
292 spec->params.accumulation = ADB_ACCUMULATION_ONE_TO_ONE; 327 spec->params.accumulation = ADB_ACCUMULATION_ONE_TO_ONE;
293 else { 328 else {
294 printf("Invalid acc\n");
295 return; 329 return;
296 } 330 }
297 331
298 if(strcmp(distType, "DOT_PRODUCT") == 0) 332 if(strcmp(distType, "DOT_PRODUCT") == 0)
299 spec->params.distance = ADB_DISTANCE_DOT_PRODUCT; 333 spec->params.distance = ADB_DISTANCE_DOT_PRODUCT;
300 else if(strcmp(distType, "EUCLIDEAN_NORMED") == 0) 334 else if(strcmp(distType, "EUCLIDEAN_NORMED") == 0)
301 spec->params.distance = ADB_DISTANCE_EUCLIDEAN_NORMED; 335 spec->params.distance = ADB_DISTANCE_EUCLIDEAN_NORMED;
302 else if(strcmp(distType, "EUCLIDEAN") == 0) 336 else if(strcmp(distType, "EUCLIDEAN") == 0)
303 spec->params.distance = ADB_DISTANCE_EUCLIDEAN; 337 spec->params.distance = ADB_DISTANCE_EUCLIDEAN;
304 else { 338 else {
305 printf("Invalid dist\n");
306 return; 339 return;
307 } 340 }
308 341
342 int i;
343
344 fid = (*env)->GetFieldID(env, queryClass, "includeKeys", "[Ljava/lang/String;");
345 if(fid == NULL) return;
346 jobjectArray includeObj = (jobjectArray)((*env)->GetObjectField(env, queryObject, fid));
347 jsize len = (*env)->GetArrayLength(env, includeObj);
348
349 if(len > 0)
350 {
351 spec->refine.flags |= ADB_REFINE_INCLUDE_KEYLIST;
352 spec->refine.include.nkeys = len;
353 spec->refine.include.keys = (const char **)calloc(sizeof(const char *), spec->refine.include.nkeys);
354 for(i=0; i<spec->refine.include.nkeys; i++) {
355 jstring key = (*env)->GetObjectArrayElement(env, includeObj, i);
356 spec->refine.include.keys[i] = (*env)->GetStringUTFChars(env, key, NULL);
357 }
358 }
359
360 fid = (*env)->GetFieldID(env, queryClass, "excludeKeys", "[Ljava/lang/String;");
361 if(fid == NULL) return;
362 jobjectArray excludeObj = (jobjectArray)((*env)->GetObjectField(env, queryObject, fid));
363 len = (*env)->GetArrayLength(env, excludeObj);
364
365 if(len > 0)
366 {
367 spec->refine.flags |= ADB_REFINE_EXCLUDE_KEYLIST;
368 spec->refine.exclude.nkeys = len;
369 spec->refine.exclude.keys = (const char **)calloc(sizeof(const char *), spec->refine.exclude.nkeys);
370 for(i=0; i<spec->refine.exclude.nkeys; i++) {
371 jstring key = (*env)->GetObjectArrayElement(env, excludeObj, i);
372 spec->refine.exclude.keys[i] = (*env)->GetStringUTFChars(env, key, NULL);
373 }
374 }
375
309 // Rest of refine 376 // Rest of refine
310 377
311 double radius = get_double_val(env, queryClass, queryObject, "radius", 0); 378 double radius = get_double_val(env, queryClass, queryObject, "radius", 0);
312 double absThres = get_double_val(env, queryClass, queryObject, "absThres", 0); 379 double absThres = get_double_val(env, queryClass, queryObject, "absThres", 0);
313 double relThres = get_double_val(env, queryClass, queryObject, "relThres", 0); 380 double relThres = get_double_val(env, queryClass, queryObject, "relThres", 0);
342 409
343 spec->qid.datum->data = NULL; 410 spec->qid.datum->data = NULL;
344 spec->qid.datum->power = NULL; 411 spec->qid.datum->power = NULL;
345 spec->qid.datum->times = NULL; 412 spec->qid.datum->times = NULL;
346 413
347 printf("seq length: %d seq start: %d points: %d tracks: %d\n",
348 spec->qid.sequence_length,
349 spec->qid.sequence_start,
350 spec->params.npoints,
351 spec->params.ntracks);
352 printf("Radius: %f Abs: %f Rel: %f Dur: %f Hop: %d\n", radius, absThres, relThres, durRatio, hopSize);
353 printf("Key: %s Acc: %s Dist: %s\n", keyStr, accType, distType);
354
355 int ok = audiodb_retrieve_datum(handle, keyStr, spec->qid.datum); 414 int ok = audiodb_retrieve_datum(handle, keyStr, spec->qid.datum);
356 if(ok != 0) { 415 if(ok != 0) {
357 printf("No datum\n");
358 return; 416 return;
359 } 417 }
360 result = audiodb_query_spec(handle, spec); 418 result = audiodb_query_spec(handle, spec);
361 419
362 if(result == NULL) { 420 if(result == NULL) {
363 printf("No result\n"); 421 return;
364 return; 422 }
365 }
366 printf("OK: %d\n", ok);
367 (*env)->DeleteLocalRef(env, queryClass); 423 (*env)->DeleteLocalRef(env, queryClass);
368 } 424
369 425 return build_results(env, result);
426 }
427