Mercurial > hg > audiodb
diff bindings/java/ext/libAudioDB_JNI.c @ 725:7e1fa27b67ee
* Full status support
* Insert support (not fully tested)
* Unit tests for create + initial insert
author | mas01mj |
---|---|
date | Wed, 21 Jul 2010 14:27:07 +0000 |
parents | 11fd16e1d8b3 |
children | fe2282b9bfb0 |
line wrap: on
line diff
--- a/bindings/java/ext/libAudioDB_JNI.c Wed Jul 14 17:21:24 2010 +0000 +++ b/bindings/java/ext/libAudioDB_JNI.c Wed Jul 21 14:27:07 2010 +0000 @@ -1,8 +1,34 @@ +#include <sys/stat.h> #include "org_omras2_AudioDB.h" #include "org_omras2_AudioDB_Mode.h" #include <jni.h> #include "audioDB_API.h" #include <stdlib.h> +#include <fcntl.h> + +// Following Ben's lead here! +#define ADB_HEADER_FLAG_L2NORM 0x1 +#define ADB_HEADER_FLAG_POWER 0x4 +#define ADB_HEADER_FLAG_TIMES 0x20 +#define ADB_HEADER_FLAG_REFERENCES 0x40 + + +adb_t* get_handle(JNIEnv *env, jobject obj) +{ + // Fetch the adb pointer + + adb_t *handle; + + jclass adbClass = (*env)->GetObjectClass(env, obj); + jfieldID fid = (*env)->GetFieldID(env, adbClass, "adbHandle", "J"); + if(fid == NULL) { + return; + } + + handle = (adb_t*)((*env)->GetLongField(env, obj, fid)); + (*env)->DeleteLocalRef(env, adbClass); + return handle; +} JNIEXPORT jboolean JNICALL Java_org_omras2_AudioDB_audiodb_1create (JNIEnv *env, jobject obj, jstring path, jint datasize, jint ntracks, jint datadim) { @@ -17,6 +43,37 @@ if(!handle) return JNI_FALSE; + (*env)->ReleaseStringUTFChars(env, path, str); + return JNI_TRUE; +} + +JNIEXPORT jboolean JNICALL Java_org_omras2_AudioDB_audiodb_1open (JNIEnv *env, jobject obj, jstring path, jobject mode) +{ + // TODO: If we have a handle, close the old one. + if(get_handle(env, obj)) + { + return; + } + + jclass modeClass = (*env)->FindClass(env, "org/omras2/AudioDB$Mode"); + jmethodID getNameMethod = (*env)->GetMethodID(env, modeClass, "name", "()Ljava/lang/String;"); + jstring value = (jstring)(*env)->CallObjectMethod(env, mode, getNameMethod); + const char* openMode = (*env)->GetStringUTFChars(env, value, 0); + const char* pathVal = (*env)->GetStringUTFChars(env, path, 0); + int modeVal = 0; + if(strcmp(openMode, "O_RDWR") == 0) + { + modeVal = O_RDWR; + } + else if(strcmp(openMode, "O_RDONLY") == 0) + { + modeVal = O_RDONLY; + } + else + return; + + adb_t *handle; + handle = audiodb_open(pathVal, modeVal); jclass adbClass = (*env)->GetObjectClass(env, obj); jfieldID fid = (*env)->GetFieldID(env, adbClass, "adbHandle", "J"); if(fid == NULL) { @@ -24,22 +81,56 @@ } (*env)->SetLongField(env, obj, fid, (long)handle); (*env)->DeleteLocalRef(env, adbClass); - (*env)->ReleaseStringUTFChars(env, path, str); - return JNI_TRUE; -} - -JNIEXPORT jboolean JNICALL Java_org_omras2_AudioDB_audiodb_1open (JNIEnv *env, jobject obj, jstring path, jobject mode) -{ - jclass modeClass = (*env)->FindClass(env, "org/omras2/AudioDB$Mode"); - jmethodID getNameMethod = (*env)->GetMethodID(env, modeClass, "name", "()Ljava/lang/String;"); - jstring value = (jstring)(*env)->CallObjectMethod(env, mode, getNameMethod); - const char* openMode = (*env)->GetStringUTFChars(env, value, 0); return JNI_TRUE; } -JNIEXPORT void JNICALL Java_org_omras2_AudioDB_insert(JNIEnv *env, jobject obj) +JNIEXPORT void JNICALL Java_org_omras2_AudioDB_audiodb_1close (JNIEnv *env, jobject obj) { + adb_t *handle = get_handle(env, obj); + if(!handle) + return; + + audiodb_close(handle); + + jclass adbClass = (*env)->GetObjectClass(env, obj); + jfieldID fid = (*env)->GetFieldID(env, adbClass, "adbHandle", "J"); + + if(fid == NULL) { + return; + } + + (*env)->SetLongField(env, obj, fid, 0); + (*env)->DeleteLocalRef(env, adbClass); +} + +JNIEXPORT jboolean JNICALL Java_org_omras2_AudioDB_audiodb_1insert_1path(JNIEnv *env, jobject obj, jstring key, jstring features, jstring power, jstring times) +{ + adb_t *handle = get_handle(env, obj); + if(!handle) + return JNI_FALSE; + + adb_insert_t* ins = (adb_insert_t *)malloc(sizeof(adb_insert_t)); + ins->key = NULL; + ins->features = NULL; + ins->power = NULL; + ins->times = NULL; + + if(key) + ins->key = (*env)->GetStringUTFChars(env, key, 0); + if(features) + ins->features = (*env)->GetStringUTFChars(env, features, 0); + if(power) + ins->power = (*env)->GetStringUTFChars(env, power, 0); + if(times) + ins->times = (*env)->GetStringUTFChars(env, times, 0); + + int result = audiodb_insert(handle, ins); + + if(result) + return JNI_FALSE; + + return JNI_TRUE; } JNIEXPORT void JNICALL Java_org_omras2_AudioDB_query(JNIEnv *env, jobject obj) @@ -48,20 +139,9 @@ JNIEXPORT jobject JNICALL Java_org_omras2_AudioDB_audiodb_1status(JNIEnv *env, jobject obj) { - - // Fetch the adb pointer - - adb_t *handle; - - jclass adbClass = (*env)->GetObjectClass(env, obj); - jfieldID fid = (*env)->GetFieldID(env, adbClass, "adbHandle", "J"); - if(fid == NULL) { - return; - } - - handle = (adb_t*)((*env)->GetLongField(env, obj, fid)); - (*env)->DeleteLocalRef(env, adbClass); - + adb_t *handle = get_handle(env, obj); + if(!handle) + return NULL; adb_status_t *status; status = (adb_status_t *)malloc(sizeof(adb_status_t)); int flags = audiodb_status(handle, status); @@ -77,11 +157,48 @@ jobject result = (*env)->NewObject(env, statusClass, cid); - fid = (*env)->GetFieldID(env, statusClass, "numFiles", "I"); - if(fid == NULL) { - return; - } + // This needs a macro! + jfieldID fid = (*env)->GetFieldID(env, statusClass, "numFiles", "I"); + if(fid == NULL) return; (*env)->SetIntField(env, result, fid, status->numFiles); + + fid = (*env)->GetFieldID(env, statusClass, "dim", "I"); + if(fid == NULL) return; + (*env)->SetIntField(env, result, fid, status->dim); + + fid = (*env)->GetFieldID(env, statusClass, "dudCount", "I"); + if(fid == NULL) return; + (*env)->SetIntField(env, result, fid, status->dudCount); + + fid = (*env)->GetFieldID(env, statusClass, "nullCount", "I"); + if(fid == NULL) return; + (*env)->SetIntField(env, result, fid, status->nullCount); + + fid = (*env)->GetFieldID(env, statusClass, "length", "I"); + if(fid == NULL) return; + (*env)->SetIntField(env, result, fid, status->length); + + fid = (*env)->GetFieldID(env, statusClass, "dataRegionSize", "I"); + if(fid == NULL) return; + (*env)->SetIntField(env, result, fid, status->data_region_size); + + // Flags + + fid = (*env)->GetFieldID(env, statusClass, "isL2Normed", "Z"); + if(fid == NULL) return; + (*env)->SetBooleanField(env, result, fid, (status->flags & ADB_HEADER_FLAG_L2NORM)); + + fid = (*env)->GetFieldID(env, statusClass, "hasPower", "Z"); + if(fid == NULL) return; + (*env)->SetBooleanField(env, result, fid, (status->flags & ADB_HEADER_FLAG_POWER)); + + fid = (*env)->GetFieldID(env, statusClass, "hasTimes", "Z"); + if(fid == NULL) return; + (*env)->SetBooleanField(env, result, fid, (status->flags & ADB_HEADER_FLAG_TIMES)); + + fid = (*env)->GetFieldID(env, statusClass, "hasReferences", "Z"); + if(fid == NULL) return; + (*env)->SetBooleanField(env, result, fid, (status->flags & ADB_HEADER_FLAG_REFERENCES)); (*env)->DeleteLocalRef(env, statusClass);