Mercurial > hg > jvamp
changeset 49:2db3640905ef
Rewrite RealTime so as not to use a native object handle, removing onerous and unsatisfactory requirement to call dispose() on all RealTime objects or leak native heap
author | Chris Cannam |
---|---|
date | Wed, 02 Sep 2015 15:17:40 +0100 |
parents | bac96f9d9295 |
children | aadf45ed0d40 |
files | org/vamp_plugins/RealTime.java src/Plugin.cpp src/RealTime.cpp src/getset.cpp src/getset.h src/org_vamp_plugins_RealTime.h test/test.java |
diffstat | 7 files changed, 41 insertions(+), 43 deletions(-) [+] |
line wrap: on
line diff
--- a/org/vamp_plugins/RealTime.java Wed Mar 06 15:08:40 2013 +0000 +++ b/org/vamp_plugins/RealTime.java Wed Sep 02 15:17:40 2015 +0100 @@ -34,12 +34,18 @@ package org.vamp_plugins; +/** + * RealTime class, corresponding to the C++ Vamp::RealTime. + * + * Although the implementation is in native code, this class does not + * store a native object handle and has no dispose() method -- it can + * be garbage collected without prior disposal like any plain Java + * object. + */ public class RealTime { public RealTime(int s, int n) { initialise(s, n); } - public native void dispose(); - public native int sec(); public native int nsec(); @@ -59,7 +65,8 @@ public native static long realTime2Frame(RealTime r, int sampleRate); private native void initialise(int s, int n); - private long nativeHandle; + private int m_s; + private int m_n; }
--- a/src/Plugin.cpp Wed Mar 06 15:08:40 2013 +0000 +++ b/src/Plugin.cpp Wed Sep 02 15:17:40 2015 +0100 @@ -372,7 +372,7 @@ { Plugin *p = getHandle<Plugin>(env, obj); - const Vamp::RealTime *const rt = getHandle<Vamp::RealTime>(env, timestamp); + Vamp::RealTime rt = getRealTime(env, timestamp); int channels = env->GetArrayLength(data); float **arr = new float *[channels]; @@ -383,7 +383,7 @@ input[c] = arr[c] + offset; } - Plugin::FeatureSet features = p->process(input, *rt); + Plugin::FeatureSet features = p->process(input, rt); for (int c = 0; c < channels; ++c) { jfloatArray cdata = (jfloatArray)env->GetObjectArrayElement(data, c);
--- a/src/RealTime.cpp Wed Mar 06 15:08:40 2013 +0000 +++ b/src/RealTime.cpp Wed Sep 02 15:17:40 2015 +0100 @@ -36,59 +36,51 @@ #include <vamp-hostsdk/RealTime.h> -#include "handle.h" +#include "getset.h" using Vamp::RealTime; using std::string; -JNIEXPORT void JNICALL -Java_org_vamp_1plugins_RealTime_dispose(JNIEnv *env, jobject obj) -{ - RealTime *rt = getHandle<RealTime>(env, obj); - setHandle<RealTime>(env, obj, 0); - delete rt; -} - JNIEXPORT jint JNICALL Java_org_vamp_1plugins_RealTime_sec(JNIEnv *env, jobject obj) { - RealTime *rt = getHandle<RealTime>(env, obj); - return rt->sec; + RealTime rt = getRealTime(env, obj); + return rt.sec; } JNIEXPORT jint JNICALL Java_org_vamp_1plugins_RealTime_nsec(JNIEnv *env, jobject obj) { - RealTime *rt = getHandle<RealTime>(env, obj); - return rt->nsec; + RealTime rt = getRealTime(env, obj); + return rt.nsec; } JNIEXPORT jint JNICALL Java_org_vamp_1plugins_RealTime_usec(JNIEnv *env, jobject obj) { - RealTime *rt = getHandle<RealTime>(env, obj); - return rt->usec(); + RealTime rt = getRealTime(env, obj); + return rt.usec(); } JNIEXPORT jint JNICALL Java_org_vamp_1plugins_RealTime_msec(JNIEnv *env, jobject obj) { - RealTime *rt = getHandle<RealTime>(env, obj); - return rt->msec(); + RealTime rt = getRealTime(env, obj); + return rt.msec(); } JNIEXPORT jstring JNICALL Java_org_vamp_1plugins_RealTime_toString(JNIEnv *env, jobject obj) { - RealTime *rt = getHandle<RealTime>(env, obj); - return env->NewStringUTF(rt->toString().c_str()); + RealTime rt = getRealTime(env, obj); + return env->NewStringUTF(rt.toString().c_str()); } JNIEXPORT jstring JNICALL Java_org_vamp_1plugins_RealTime_toText(JNIEnv *env, jobject obj) { - RealTime *rt = getHandle<RealTime>(env, obj); - return env->NewStringUTF(rt->toText().c_str()); + RealTime rt = getRealTime(env, obj); + return env->NewStringUTF(rt.toText().c_str()); } JNIEXPORT jobject JNICALL @@ -121,16 +113,14 @@ JNIEXPORT jlong JNICALL Java_org_vamp_1plugins_RealTime_realTime2Frame(JNIEnv *env, jclass cls, jobject obj, jint sampleRate) { - RealTime *rt = getHandle<RealTime>(env, obj); - return RealTime::realTime2Frame(*rt, sampleRate); + RealTime rt = getRealTime(env, obj); + return RealTime::realTime2Frame(rt, sampleRate); } JNIEXPORT void JNICALL Java_org_vamp_1plugins_RealTime_initialise(JNIEnv *env, jobject obj, jint sec, jint nsec) { - RealTime *rt = new RealTime(sec, nsec); - setHandle(env, obj, rt); + setIntField(env, obj, "m_s", sec); + setIntField(env, obj, "m_n", nsec); } - -
--- a/src/getset.cpp Wed Mar 06 15:08:40 2013 +0000 +++ b/src/getset.cpp Wed Sep 02 15:17:40 2015 +0100 @@ -44,6 +44,14 @@ env->GetFieldID(cls, name.c_str(), "I")); } +Vamp::RealTime +getRealTime(JNIEnv *env, jobject obj) +{ + int s = getIntField(env, obj, "m_s"); + int n = getIntField(env, obj, "m_n"); + return Vamp::RealTime(s, n); +} + void setStringField(JNIEnv *env, jobject obj, std::string name, std::string value) {
--- a/src/getset.h Wed Mar 06 15:08:40 2013 +0000 +++ b/src/getset.h Wed Sep 02 15:17:40 2015 +0100 @@ -45,6 +45,9 @@ extern int getIntField(JNIEnv *env, jobject obj, std::string name); +extern Vamp::RealTime +getRealTime(JNIEnv *env, jobject obj); // where obj is a RealTime object + extern void setStringField(JNIEnv *env, jobject obj, std::string name, std::string value);
--- a/src/org_vamp_plugins_RealTime.h Wed Mar 06 15:08:40 2013 +0000 +++ b/src/org_vamp_plugins_RealTime.h Wed Sep 02 15:17:40 2015 +0100 @@ -7,13 +7,6 @@ #ifdef __cplusplus extern "C" { #endif -/* - * Class: org_vamp_plugins_RealTime - * Method: dispose - * Signature: ()V - */ -JNIEXPORT void JNICALL Java_org_vamp_1plugins_RealTime_dispose - (JNIEnv *, jobject); /* * Class: org_vamp_plugins_RealTime
--- a/test/test.java Wed Mar 06 15:08:40 2013 +0000 +++ b/test/test.java Wed Sep 02 15:17:40 2015 +0100 @@ -126,10 +126,7 @@ buffers[0][1] = -0.5f; } RealTime timestamp = RealTime.frame2RealTime(block * 1024, 44100); - Map<Integer, List<Feature>> - features = p.process(buffers, timestamp); - - timestamp.dispose(); + Map<Integer, List<Feature>> features = p.process(buffers, timestamp); printFeatures(features); }