#ifndef jniHelpers_H #define jniHelpers_H #include <jni.h> #ifndef GDXPOOL_POOLCLAZZ #define GDXPOOL_POOLCLAZZ "Lcom/badlogic/gdx/utils/Pool;" #endif #ifndef GDXPOOL_OBTAINFUNC #define GDXPOOL_OBTAINFUNC "obtain" #endif #ifndef GDXPOOL_OBTAINSIG #define GDXPOOL_OBTAINSIG "()Ljava/lang/Object;" #endif #ifndef GDXPOOL_FREEFUNC #define GDXPOOL_FREEFUNC "free" #endif #ifndef GDXPOOL_FREESIG #define GDXPOOL_FREESIG "(Ljava/lang/Object;)V" #endif struct 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; JNIEnv *env; jclass cls; jobject pool; jmethodID obtainMethod; jmethodID freeMethod; jobject tmp; /** eg: if you have in java: * class CommonJNI { * public static com.xxx.a.Pool<com.xxx.b.Clazz> poolClazz; * public static com.xxx.b.Clazz tempClazz; * } * then construct using: * GdxPool(jenv, jclass("CommonJNI"), "poolClazz", "Lcom/xxx/b/Clazz;", "tempClazz"); */ GdxPool(const char * const &poolField, const char * const &typeName = 0, const char * const &tempField = 0, const char * const &poolClazz = GDXPOOL_POOLCLAZZ, const char * const &obtainName = GDXPOOL_OBTAINFUNC, const char * const &obtainSig = GDXPOOL_OBTAINSIG, const char * const &freeName = GDXPOOL_FREEFUNC, const char * const &freeSig = GDXPOOL_FREESIG); virtual ~GdxPool(); void setEnv(JNIEnv * const &env); /** Obtain a jobject from the pool */ jobject obtain(JNIEnv * const &env); /** Free a jobject back to the pool */ void free(jobject &obj); /** Get the temp instance (if available) */ jobject temp(JNIEnv * const &e); }; struct GdxPooledObject { GdxPool * const &pool; jobject obj; const bool autoFree; GdxPooledObject(JNIEnv * const &e, GdxPool * const &pool, const bool &autoFree); GdxPooledObject(JNIEnv * const &e, GdxPool &pool, const bool &autoFree); virtual ~GdxPooledObject(); void free(); }; #endif //jniHelpers_H