comparison 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
comparison
equal deleted inserted replaced
724:11fd16e1d8b3 725:7e1fa27b67ee
1 #include <sys/stat.h>
1 #include "org_omras2_AudioDB.h" 2 #include "org_omras2_AudioDB.h"
2 #include "org_omras2_AudioDB_Mode.h" 3 #include "org_omras2_AudioDB_Mode.h"
3 #include <jni.h> 4 #include <jni.h>
4 #include "audioDB_API.h" 5 #include "audioDB_API.h"
5 #include <stdlib.h> 6 #include <stdlib.h>
7 #include <fcntl.h>
8
9 // Following Ben's lead here!
10 #define ADB_HEADER_FLAG_L2NORM 0x1
11 #define ADB_HEADER_FLAG_POWER 0x4
12 #define ADB_HEADER_FLAG_TIMES 0x20
13 #define ADB_HEADER_FLAG_REFERENCES 0x40
14
15
16 adb_t* get_handle(JNIEnv *env, jobject obj)
17 {
18 // Fetch the adb pointer
19
20 adb_t *handle;
21
22 jclass adbClass = (*env)->GetObjectClass(env, obj);
23 jfieldID fid = (*env)->GetFieldID(env, adbClass, "adbHandle", "J");
24 if(fid == NULL) {
25 return;
26 }
27
28 handle = (adb_t*)((*env)->GetLongField(env, obj, fid));
29 (*env)->DeleteLocalRef(env, adbClass);
30 return handle;
31 }
6 32
7 JNIEXPORT jboolean JNICALL Java_org_omras2_AudioDB_audiodb_1create (JNIEnv *env, jobject obj, jstring path, jint datasize, jint ntracks, jint datadim) 33 JNIEXPORT jboolean JNICALL Java_org_omras2_AudioDB_audiodb_1create (JNIEnv *env, jobject obj, jstring path, jint datasize, jint ntracks, jint datadim)
8 { 34 {
9 char buf[256]; 35 char buf[256];
10 const char *str; 36 const char *str;
15 adb_t *handle; 41 adb_t *handle;
16 handle = audiodb_create(str, datasize, ntracks, datadim); 42 handle = audiodb_create(str, datasize, ntracks, datadim);
17 if(!handle) 43 if(!handle)
18 return JNI_FALSE; 44 return JNI_FALSE;
19 45
20 jclass adbClass = (*env)->GetObjectClass(env, obj);
21 jfieldID fid = (*env)->GetFieldID(env, adbClass, "adbHandle", "J");
22 if(fid == NULL) {
23 return;
24 }
25 (*env)->SetLongField(env, obj, fid, (long)handle);
26 (*env)->DeleteLocalRef(env, adbClass);
27 (*env)->ReleaseStringUTFChars(env, path, str); 46 (*env)->ReleaseStringUTFChars(env, path, str);
28 return JNI_TRUE; 47 return JNI_TRUE;
29 } 48 }
30 49
31 JNIEXPORT jboolean JNICALL Java_org_omras2_AudioDB_audiodb_1open (JNIEnv *env, jobject obj, jstring path, jobject mode) 50 JNIEXPORT jboolean JNICALL Java_org_omras2_AudioDB_audiodb_1open (JNIEnv *env, jobject obj, jstring path, jobject mode)
32 { 51 {
52 // TODO: If we have a handle, close the old one.
53 if(get_handle(env, obj))
54 {
55 return;
56 }
57
33 jclass modeClass = (*env)->FindClass(env, "org/omras2/AudioDB$Mode"); 58 jclass modeClass = (*env)->FindClass(env, "org/omras2/AudioDB$Mode");
34 jmethodID getNameMethod = (*env)->GetMethodID(env, modeClass, "name", "()Ljava/lang/String;"); 59 jmethodID getNameMethod = (*env)->GetMethodID(env, modeClass, "name", "()Ljava/lang/String;");
35 jstring value = (jstring)(*env)->CallObjectMethod(env, mode, getNameMethod); 60 jstring value = (jstring)(*env)->CallObjectMethod(env, mode, getNameMethod);
36 const char* openMode = (*env)->GetStringUTFChars(env, value, 0); 61 const char* openMode = (*env)->GetStringUTFChars(env, value, 0);
37 62 const char* pathVal = (*env)->GetStringUTFChars(env, path, 0);
38 return JNI_TRUE; 63 int modeVal = 0;
39 } 64 if(strcmp(openMode, "O_RDWR") == 0)
40 65 {
41 JNIEXPORT void JNICALL Java_org_omras2_AudioDB_insert(JNIEnv *env, jobject obj) 66 modeVal = O_RDWR;
42 { 67 }
43 } 68 else if(strcmp(openMode, "O_RDONLY") == 0)
44 69 {
45 JNIEXPORT void JNICALL Java_org_omras2_AudioDB_query(JNIEnv *env, jobject obj) 70 modeVal = O_RDONLY;
46 { 71 }
47 } 72 else
48 73 return;
49 JNIEXPORT jobject JNICALL Java_org_omras2_AudioDB_audiodb_1status(JNIEnv *env, jobject obj)
50 {
51
52 // Fetch the adb pointer
53 74
54 adb_t *handle; 75 adb_t *handle;
55 76 handle = audiodb_open(pathVal, modeVal);
56 jclass adbClass = (*env)->GetObjectClass(env, obj); 77 jclass adbClass = (*env)->GetObjectClass(env, obj);
57 jfieldID fid = (*env)->GetFieldID(env, adbClass, "adbHandle", "J"); 78 jfieldID fid = (*env)->GetFieldID(env, adbClass, "adbHandle", "J");
58 if(fid == NULL) { 79 if(fid == NULL) {
59 return; 80 return;
60 } 81 }
61 82 (*env)->SetLongField(env, obj, fid, (long)handle);
62 handle = (adb_t*)((*env)->GetLongField(env, obj, fid));
63 (*env)->DeleteLocalRef(env, adbClass); 83 (*env)->DeleteLocalRef(env, adbClass);
64 84
85 return JNI_TRUE;
86 }
87
88 JNIEXPORT void JNICALL Java_org_omras2_AudioDB_audiodb_1close (JNIEnv *env, jobject obj)
89 {
90 adb_t *handle = get_handle(env, obj);
91 if(!handle)
92 return;
93
94 audiodb_close(handle);
95
96 jclass adbClass = (*env)->GetObjectClass(env, obj);
97 jfieldID fid = (*env)->GetFieldID(env, adbClass, "adbHandle", "J");
98
99 if(fid == NULL) {
100 return;
101 }
102
103 (*env)->SetLongField(env, obj, fid, 0);
104 (*env)->DeleteLocalRef(env, adbClass);
105 }
106
107 JNIEXPORT jboolean JNICALL Java_org_omras2_AudioDB_audiodb_1insert_1path(JNIEnv *env, jobject obj, jstring key, jstring features, jstring power, jstring times)
108 {
109 adb_t *handle = get_handle(env, obj);
110 if(!handle)
111 return JNI_FALSE;
112
113 adb_insert_t* ins = (adb_insert_t *)malloc(sizeof(adb_insert_t));
114 ins->key = NULL;
115 ins->features = NULL;
116 ins->power = NULL;
117 ins->times = NULL;
118
119 if(key)
120 ins->key = (*env)->GetStringUTFChars(env, key, 0);
121 if(features)
122 ins->features = (*env)->GetStringUTFChars(env, features, 0);
123 if(power)
124 ins->power = (*env)->GetStringUTFChars(env, power, 0);
125 if(times)
126 ins->times = (*env)->GetStringUTFChars(env, times, 0);
127
128 int result = audiodb_insert(handle, ins);
129
130 if(result)
131 return JNI_FALSE;
132
133 return JNI_TRUE;
134 }
135
136 JNIEXPORT void JNICALL Java_org_omras2_AudioDB_query(JNIEnv *env, jobject obj)
137 {
138 }
139
140 JNIEXPORT jobject JNICALL Java_org_omras2_AudioDB_audiodb_1status(JNIEnv *env, jobject obj)
141 {
142 adb_t *handle = get_handle(env, obj);
143 if(!handle)
144 return NULL;
65 adb_status_t *status; 145 adb_status_t *status;
66 status = (adb_status_t *)malloc(sizeof(adb_status_t)); 146 status = (adb_status_t *)malloc(sizeof(adb_status_t));
67 int flags = audiodb_status(handle, status); 147 int flags = audiodb_status(handle, status);
68 148
69 jclass statusClass = (*env)->FindClass(env, "org/omras2/Status"); 149 jclass statusClass = (*env)->FindClass(env, "org/omras2/Status");
75 return NULL; 155 return NULL;
76 } 156 }
77 157
78 jobject result = (*env)->NewObject(env, statusClass, cid); 158 jobject result = (*env)->NewObject(env, statusClass, cid);
79 159
80 fid = (*env)->GetFieldID(env, statusClass, "numFiles", "I"); 160 // This needs a macro!
81 if(fid == NULL) { 161 jfieldID fid = (*env)->GetFieldID(env, statusClass, "numFiles", "I");
82 return; 162 if(fid == NULL) return;
83 }
84 (*env)->SetIntField(env, result, fid, status->numFiles); 163 (*env)->SetIntField(env, result, fid, status->numFiles);
164
165 fid = (*env)->GetFieldID(env, statusClass, "dim", "I");
166 if(fid == NULL) return;
167 (*env)->SetIntField(env, result, fid, status->dim);
168
169 fid = (*env)->GetFieldID(env, statusClass, "dudCount", "I");
170 if(fid == NULL) return;
171 (*env)->SetIntField(env, result, fid, status->dudCount);
172
173 fid = (*env)->GetFieldID(env, statusClass, "nullCount", "I");
174 if(fid == NULL) return;
175 (*env)->SetIntField(env, result, fid, status->nullCount);
176
177 fid = (*env)->GetFieldID(env, statusClass, "length", "I");
178 if(fid == NULL) return;
179 (*env)->SetIntField(env, result, fid, status->length);
180
181 fid = (*env)->GetFieldID(env, statusClass, "dataRegionSize", "I");
182 if(fid == NULL) return;
183 (*env)->SetIntField(env, result, fid, status->data_region_size);
184
185 // Flags
186
187 fid = (*env)->GetFieldID(env, statusClass, "isL2Normed", "Z");
188 if(fid == NULL) return;
189 (*env)->SetBooleanField(env, result, fid, (status->flags & ADB_HEADER_FLAG_L2NORM));
190
191 fid = (*env)->GetFieldID(env, statusClass, "hasPower", "Z");
192 if(fid == NULL) return;
193 (*env)->SetBooleanField(env, result, fid, (status->flags & ADB_HEADER_FLAG_POWER));
194
195 fid = (*env)->GetFieldID(env, statusClass, "hasTimes", "Z");
196 if(fid == NULL) return;
197 (*env)->SetBooleanField(env, result, fid, (status->flags & ADB_HEADER_FLAG_TIMES));
198
199 fid = (*env)->GetFieldID(env, statusClass, "hasReferences", "Z");
200 if(fid == NULL) return;
201 (*env)->SetBooleanField(env, result, fid, (status->flags & ADB_HEADER_FLAG_REFERENCES));
85 202
86 (*env)->DeleteLocalRef(env, statusClass); 203 (*env)->DeleteLocalRef(env, statusClass);
87 204
88 return result; 205 return result;
89 } 206 }