#include "jniHelpers.h" GdxPool::GdxPool(const char * const &poolField, const char * const &typeName, const char * const &tempField, const char * const &poolClazz, const char * const &obtainName, const char * const &obtainSig, const char * const &freeName, const char * const &freeSig) : env(0), cls(0), pool(0), tmp(0), poolField(poolField), typeName(typeName), tempField(tempField), poolClazz(poolClazz), obtainName(obtainName), obtainSig(obtainSig), freeName(freeName), freeSig(freeSig) { } GdxPool::~GdxPool() { if (pool) env->DeleteGlobalRef(pool); if (tmp) env->DeleteGlobalRef(tmp); if (cls) env->DeleteGlobalRef(cls); } void GdxPool::setEnv(JNIEnv * const &e) { env = e; cls = (jclass)env->NewGlobalRef(env->FindClass(typeName)); jfieldID poolFieldID = env->GetStaticFieldID(cls, poolField, poolClazz); pool = env->NewGlobalRef(env->GetStaticObjectField(cls, poolFieldID)); jclass poolClass = env->GetObjectClass(pool); obtainMethod = env->GetMethodID(poolClass, obtainName, obtainSig); freeMethod = env->GetMethodID(poolClass, freeName, freeSig); env->DeleteLocalRef(poolClass); if (typeName && tempField) { jfieldID tempFieldID = env->GetStaticFieldID(cls, tempField, typeName); tmp = env->NewGlobalRef(env->GetStaticObjectField(cls, tempFieldID)); } } jobject GdxPool::obtain(JNIEnv * const &e) { if (!env) setEnv(e); jobject result = env->CallObjectMethod(pool, obtainMethod); return result; } void GdxPool::free(jobject &obj) { env->CallVoidMethod(pool, freeMethod, obj); } jobject GdxPool::temp(JNIEnv * const &e) { if (!env) setEnv(e); return tmp; } GdxPooledObject::GdxPooledObject(JNIEnv * const &e, GdxPool * const &pool, const bool &autoFree) : pool(pool), autoFree(autoFree), obj(pool->obtain(e)) { } GdxPooledObject::GdxPooledObject(JNIEnv * const &e, GdxPool &pool, const bool &autoFree) : pool(&pool), autoFree(autoFree), obj(pool.obtain(e)) { } GdxPooledObject::~GdxPooledObject() { if (autoFree) free(); } void GdxPooledObject::free() { pool->free(obj); }