15
#if defined(DEBUG_DIRECTOR_OWNED)
20
/* Java object wrapper */
21
class JObjectWrapper {
23
JObjectWrapper() : jthis_(NULL), weak_global_(true) {
31
bool set(JNIEnv *jenv, jobject jobj, bool mem_own, bool weak_global) {
33
weak_global_ = weak_global;
35
jthis_ = ((weak_global_ || !mem_own) ? jenv->NewWeakGlobalRef(jobj) : jenv->NewGlobalRef(jobj));
36
#if defined(DEBUG_DIRECTOR_OWNED)
37
std::cout << "JObjectWrapper::set(" << jobj << ", " << (weak_global ? "weak_global" : "global_ref") << ") -> " << jthis_ << std::endl;
41
#if defined(DEBUG_DIRECTOR_OWNED)
42
std::cout << "JObjectWrapper::set(" << jobj << ", " << (weak_global ? "weak_global" : "global_ref") << ") -> already set" << std::endl;
48
jobject get(JNIEnv *jenv) const {
49
#if defined(DEBUG_DIRECTOR_OWNED)
50
std::cout << "JObjectWrapper::get(";
55
std::cout << ") -> return new local ref" << std::endl;
57
return (jthis_ ? jenv->NewLocalRef(jthis_) : jthis_);
60
void release(JNIEnv *jenv) {
61
#if defined(DEBUG_DIRECTOR_OWNED)
62
std::cout << "JObjectWrapper::release(" << jthis_ << "): " << (weak_global_ ? "weak global ref" : "global ref") << std::endl;
66
if (jenv->IsSameObject(jthis_, NULL) == JNI_FALSE)
67
jenv->DeleteWeakGlobalRef((jweak)jthis_);
69
jenv->DeleteGlobalRef(jthis_);
80
/* Java proxy releases ownership of C++ object, C++ object is now
81
responsible for destruction (creates NewGlobalRef to pin Java
83
void java_change_ownership(JNIEnv *jenv, jobject jself, bool take_or_release) {
84
if (take_or_release) { /* Java takes ownership of C++ object's lifetime. */
86
jenv->DeleteGlobalRef(jthis_);
87
jthis_ = jenv->NewWeakGlobalRef(jself);
90
} else { /* Java releases ownership of C++ object's lifetime */
92
jenv->DeleteWeakGlobalRef((jweak)jthis_);
93
jthis_ = jenv->NewGlobalRef(jself);
100
/* pointer to Java object */
102
/* Local or global reference flag */
16
106
/* director base class */
19
/* pointer to Java virtual machine */
23
/* pointer to the wrapped Java object */
26
/* Acquire Java VM environment from Java VM */
27
JNIEnv *swig_acquire_jenv() const {
29
swig_jvm->AttachCurrentThread((void **) &env, NULL);
33
/* Disconnect director from Java object */
34
void swig_disconnect_director_self(const char *disconn_method) {
36
JNIEnv *jenv = swig_acquire_jenv();
37
jmethodID disconn_meth = jenv->GetMethodID(jenv->GetObjectClass(swig_self), disconn_method, "()V");
39
jenv->CallVoidMethod(swig_self, disconn_meth);
41
jenv->ExceptionClear();
43
jenv->DeleteGlobalRef(swig_self);
44
swig_self = (jobject) NULL;
109
/* pointer to Java virtual machine */
113
/* Java object wrapper */
114
JObjectWrapper swig_self_;
116
/* Acquire Java VM environment from Java VM */
117
JNIEnv *swig_acquire_jenv() const {
119
swig_jvm_->AttachCurrentThread((void **) &env, NULL);
123
/* Disconnect director from Java object */
124
void swig_disconnect_director_self(const char *disconn_method) {
125
JNIEnv *jenv = swig_acquire_jenv();
126
jobject jobj = swig_self_.peek();
127
#if defined(DEBUG_DIRECTOR_OWNED)
128
std::cout << "Swig::Director::disconnect_director_self(" << jobj << ")" << std::endl;
130
if (jobj && jenv->IsSameObject(jobj, NULL) == JNI_FALSE) {
131
jmethodID disconn_meth = jenv->GetMethodID(jenv->GetObjectClass(jobj), disconn_method, "()V");
133
#if defined(DEBUG_DIRECTOR_OWNED)
134
std::cout << "Swig::Director::disconnect_director_self upcall to " << disconn_method << std::endl;
136
jenv->CallVoidMethod(jobj, disconn_meth);
49
Director(JNIEnv *jenv) : swig_jvm((JavaVM *) NULL), swig_self(NULL) {
50
/* Acquire the Java VM pointer */
51
jenv->GetJavaVM(&swig_jvm);
57
/* Set swig_self and get Java global reference on object */
58
void swig_set_self(JNIEnv *jenv, jobject jself) {
59
swig_self = jenv->NewGlobalRef(jself);
62
/* return a pointer to the wrapped Java object */
63
jobject swig_get_self() const {
142
Director(JNIEnv *jenv) : swig_jvm_((JavaVM *) NULL), swig_self_() {
143
/* Acquire the Java VM pointer */
144
jenv->GetJavaVM(&swig_jvm_);
147
virtual ~Director() {
148
swig_self_.release(swig_acquire_jenv());
151
bool swig_set_self(JNIEnv *jenv, jobject jself, bool mem_own, bool weak_global) {
152
return swig_self_.set(jenv, jself, mem_own, weak_global);
155
jobject swig_get_self(JNIEnv *jenv) const {
156
return swig_self_.get(jenv);
159
// Change C++ object's ownership, relative to Java
160
void swig_java_change_ownership(JNIEnv *jenv, jobject jself, bool take_or_release) {
161
swig_self_.java_change_ownership(jenv, jself, take_or_release);