view src/getset.cpp @ 18:530bf5009ee2

Pull out Feature to a separate file; JNI doesn't seem to be able to find its constructor otherwise. Also a couple of other fixes
author Chris Cannam
date Tue, 07 Feb 2012 12:12:36 +0000
parents f7ca3afb429c
children c9515589be7d
line wrap: on
line source

#include "getset.h"

#include <iostream>

int
getIntField(JNIEnv *env, jobject obj, std::string name)
{
    jclass cls = env->GetObjectClass(obj);
    return env->GetIntField(obj,
			    env->GetFieldID(cls, name.c_str(), "I"));
}

void
setStringField(JNIEnv *env, jobject obj, std::string name, std::string value)
{
    jclass cls = env->GetObjectClass(obj);
    env->SetObjectField(obj,
			env->GetFieldID(cls, name.c_str(), "Ljava/lang/String;"),
			env->NewStringUTF(value.c_str()));
}

void
setFloatField(JNIEnv *env, jobject obj, std::string name, float value)
{
    jclass cls = env->GetObjectClass(obj);
    env->SetFloatField(obj,
		       env->GetFieldID(cls, name.c_str(), "F"),
		       value);
}

void
setBooleanField(JNIEnv *env, jobject obj, std::string name, bool value)
{
    jclass cls = env->GetObjectClass(obj);
    env->SetBooleanField(obj,
			 env->GetFieldID(cls, name.c_str(), "Z"),
			 value);
}

void
setIntField(JNIEnv *env, jobject obj, std::string name, int value)
{
    jclass cls = env->GetObjectClass(obj);
    env->SetIntField(obj,
		     env->GetFieldID(cls, name.c_str(), "I"),
		     value);
}

void
setRealTimeField(JNIEnv *env, jobject obj, std::string name, Vamp::RealTime rt)
{
    jclass rtClass = env->FindClass("org/vamp_plugins/RealTime");
    jmethodID ctor = env->GetMethodID(rtClass, "<init>", "(II)V");
    jobject jrt = env->NewObject(rtClass, ctor, rt.sec, rt.nsec);
    setObjectField(env, obj, name, "Lorg/vamp_plugins/RealTime;", jrt);
}

void
setObjectField(JNIEnv *env, jobject obj, std::string name, std::string type, jobject value)
{
    jclass cls = env->GetObjectClass(obj);
    jfieldID field = env->GetFieldID(cls, name.c_str(), type.c_str());
    env->SetObjectField(obj, field, value);
}

void
setFloatArrayField(JNIEnv *env, jobject obj, std::string name, std::vector<float> values)
{
    jfloatArray jarr = env->NewFloatArray(values.size());
    env->SetFloatArrayRegion(jarr, 0, values.size(), values.data());
    setObjectField(env, obj, name, "[F", jarr);
}

void
setStringArrayField(JNIEnv *env, jobject obj, std::string name, std::vector<std::string> values)
{
    jclass strCls = env->FindClass("java/lang/String");
    jobjectArray jarr = env->NewObjectArray(values.size(), strCls, 0);
    for (int i = 0; i < values.size(); ++i) {
	env->SetObjectArrayElement(jarr, i, env->NewStringUTF(values[i].c_str()));
    }
    setObjectField(env, obj, name, "[Ljava/lang/String;", jarr);
}

jmethodID
getEnumValueOfMethod(JNIEnv *env)
{
    jclass enumClass = env->FindClass("java/lang/Enum");

    // Enum.valueOf(Class, String) returns Enum
    jmethodID valueOfMethod = env->GetStaticMethodID
	(enumClass, "valueOf",
	 "(Ljava/lang/Class;Ljava/lang/String;)Ljava/lang/Enum;");

    return valueOfMethod;
}