Make more use of LocalRefGuard in Java
This commit is contained in:
parent
f38f6371a3
commit
2f5bf397ae
1 changed files with 17 additions and 13 deletions
|
|
@ -100,6 +100,22 @@ namespace Swig {
|
||||||
bool weak_global_;
|
bool weak_global_;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/* Local JNI reference deleter */
|
||||||
|
class LocalRefGuard {
|
||||||
|
JNIEnv *jenv_;
|
||||||
|
jobject jobj_;
|
||||||
|
|
||||||
|
// non-copyable
|
||||||
|
LocalRefGuard(const LocalRefGuard &);
|
||||||
|
LocalRefGuard &operator=(const LocalRefGuard &);
|
||||||
|
public:
|
||||||
|
LocalRefGuard(JNIEnv *jenv, jobject jobj): jenv_(jenv), jobj_(jobj) {}
|
||||||
|
~LocalRefGuard() {
|
||||||
|
if (jobj_)
|
||||||
|
jenv_->DeleteLocalRef(jobj_);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
/* director base class */
|
/* director base class */
|
||||||
class Director {
|
class Director {
|
||||||
/* pointer to Java virtual machine */
|
/* pointer to Java virtual machine */
|
||||||
|
|
@ -152,6 +168,7 @@ namespace Swig {
|
||||||
JNIEnvWrapper jnienv(this) ;
|
JNIEnvWrapper jnienv(this) ;
|
||||||
JNIEnv *jenv = jnienv.getJNIEnv() ;
|
JNIEnv *jenv = jnienv.getJNIEnv() ;
|
||||||
jobject jobj = swig_self_.get(jenv);
|
jobject jobj = swig_self_.get(jenv);
|
||||||
|
LocalRefGuard ref_deleter(jenv, jobj);
|
||||||
#if defined(DEBUG_DIRECTOR_OWNED)
|
#if defined(DEBUG_DIRECTOR_OWNED)
|
||||||
std::cout << "Swig::Director::disconnect_director_self(" << jobj << ")" << std::endl;
|
std::cout << "Swig::Director::disconnect_director_self(" << jobj << ")" << std::endl;
|
||||||
#endif
|
#endif
|
||||||
|
|
@ -164,7 +181,6 @@ namespace Swig {
|
||||||
jenv->CallVoidMethod(jobj, disconn_meth);
|
jenv->CallVoidMethod(jobj, disconn_meth);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
jenv->DeleteLocalRef(jobj);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
|
@ -379,17 +395,5 @@ namespace Swig {
|
||||||
}
|
}
|
||||||
return matches;
|
return matches;
|
||||||
}
|
}
|
||||||
|
|
||||||
class LocalRefGuard {
|
|
||||||
JNIEnv* jenv_;
|
|
||||||
jobject jobj_;
|
|
||||||
|
|
||||||
// non-copyable
|
|
||||||
LocalRefGuard(const LocalRefGuard &);
|
|
||||||
LocalRefGuard &operator=(const LocalRefGuard &);
|
|
||||||
public:
|
|
||||||
LocalRefGuard(JNIEnv* jenv, jobject jobj): jenv_(jenv), jobj_(jobj) {}
|
|
||||||
~LocalRefGuard() { if (jobj_) jenv_->DeleteLocalRef(jobj_); }
|
|
||||||
};
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue