diff bindings/java/ext/libAudioDB_JNI.c @ 724:11fd16e1d8b3

* Initial code for status call (populating Status) * Storing adb handle within Java object
author mas01mj
date Wed, 14 Jul 2010 17:21:24 +0000
parents 56e97aa9d0ae
children 7e1fa27b67ee
line wrap: on
line diff
--- a/bindings/java/ext/libAudioDB_JNI.c	Wed Jul 14 16:02:00 2010 +0000
+++ b/bindings/java/ext/libAudioDB_JNI.c	Wed Jul 14 17:21:24 2010 +0000
@@ -2,7 +2,7 @@
 #include "org_omras2_AudioDB_Mode.h"
 #include <jni.h>
 #include "audioDB_API.h"
-
+#include <stdlib.h>
 
 JNIEXPORT jboolean JNICALL Java_org_omras2_AudioDB_audiodb_1create (JNIEnv *env, jobject obj, jstring path, jint datasize, jint ntracks, jint datadim)
 {
@@ -16,7 +16,14 @@
 	handle = audiodb_create(str, datasize, ntracks, datadim);
 	if(!handle)
 		return JNI_FALSE;
-
+	
+	jclass adbClass = (*env)->GetObjectClass(env, obj);
+	jfieldID fid = (*env)->GetFieldID(env, adbClass, "adbHandle", "J");
+	if(fid == NULL) {
+		return;
+	}
+	(*env)->SetLongField(env, obj, fid, (long)handle);
+	(*env)->DeleteLocalRef(env, adbClass);
 	(*env)->ReleaseStringUTFChars(env, path, str);
 	return JNI_TRUE;
 }
@@ -39,7 +46,45 @@
 {
 }
 
-JNIEXPORT void JNICALL Java_org_omras2_AudioDB_audiodb_1status(JNIEnv *env, jobject obj)
+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_status_t *status;
+	status = (adb_status_t *)malloc(sizeof(adb_status_t));
+	int flags = audiodb_status(handle, status);	
+	
+	jclass statusClass = (*env)->FindClass(env, "org/omras2/Status");
+	if(statusClass == NULL) {
+		return NULL;
+	}	
+	jmethodID cid = (*env)->GetMethodID(env, statusClass, "<init>", "()V");
+	if(cid == NULL) {
+		return NULL;
+	}
+
+	jobject result = (*env)->NewObject(env, statusClass, cid);
+
+	fid = (*env)->GetFieldID(env, statusClass, "numFiles", "I");
+	if(fid == NULL) {
+		return;
+	}
+	(*env)->SetIntField(env, result, fid, status->numFiles);
+
+	(*env)->DeleteLocalRef(env, statusClass);
+
+	return result;
 }