+/* "Smartpointer" for Java references. */
+
+%inline {
+namespace {
+ class GlobalRefBase
+ {
+ protected:
+ GlobalRefBase (JavaVM *jvm, jobject ref);
+ GlobalRefBase (const GlobalRefBase &ref) = delete;
+ ~GlobalRefBase ();
+ JavaVM *jvm;
+ jobject jref;
+ };
+ GlobalRefBase::GlobalRefBase (JavaVM *jvm, jobject ref) : jvm(jvm), jref(0) {
+ ScopedEnv env(jvm);
+ if (env && ref)
+ jref = env->NewGlobalRef(ref);
+ }
+ GlobalRefBase::~GlobalRefBase () {
+ ScopedEnv env(jvm);
+ if(env && jref)
+ env->DeleteGlobalRef(jref);
+ }
+ template <class Jtype>
+ class GlobalRef : private GlobalRefBase
+ {
+ public:
+ GlobalRef (JavaVM *jvm, Jtype ref) : GlobalRefBase(jvm, ref) {}
+ GlobalRef (const GlobalRef &ref) : GlobalRefBase(ref.jvm, ref.jref) {}
+ operator Jtype () const { return static_cast<Jtype>(jref); }
+ };
+}
+}
+