Fix for directors and non jvm created threads - the jvm would not close
git-svn-id: https://swig.svn.sourceforge.net/svnroot/swig/trunk@9245 626c5289-ae23-0410-ae9c-e8d60b6d4f22
This commit is contained in:
parent
066efae0f1
commit
e4a580f4f3
2 changed files with 23 additions and 13 deletions
|
|
@ -103,24 +103,33 @@ namespace Swig {
|
||||||
|
|
||||||
/* director base class */
|
/* director base class */
|
||||||
class Director {
|
class Director {
|
||||||
private:
|
|
||||||
/* pointer to Java virtual machine */
|
/* pointer to Java virtual machine */
|
||||||
JavaVM *swig_jvm_;
|
JavaVM *swig_jvm_;
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
|
/* Utility class for managing the JNI environment */
|
||||||
|
class JNIEnvWrapper {
|
||||||
|
const Director *director_;
|
||||||
|
JNIEnv *jenv_;
|
||||||
|
public:
|
||||||
|
JNIEnvWrapper(const Director *director) : director_(director), jenv_(0) {
|
||||||
|
director_->swig_jvm_->AttachCurrentThread((void **) &jenv_, NULL);
|
||||||
|
}
|
||||||
|
~JNIEnvWrapper() {
|
||||||
|
director_->swig_jvm_->DetachCurrentThread();
|
||||||
|
}
|
||||||
|
JNIEnv *getJNIEnv() const {
|
||||||
|
return jenv_;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
/* Java object wrapper */
|
/* Java object wrapper */
|
||||||
JObjectWrapper swig_self_;
|
JObjectWrapper swig_self_;
|
||||||
|
|
||||||
/* Acquire Java VM environment from Java VM */
|
|
||||||
JNIEnv *swig_acquire_jenv() const {
|
|
||||||
JNIEnv *env = NULL;
|
|
||||||
swig_jvm_->AttachCurrentThread((void **) &env, NULL);
|
|
||||||
return env;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Disconnect director from Java object */
|
/* Disconnect director from Java object */
|
||||||
void swig_disconnect_director_self(const char *disconn_method) {
|
void swig_disconnect_director_self(const char *disconn_method) {
|
||||||
JNIEnv *jenv = swig_acquire_jenv();
|
JNIEnvWrapper jnienv(this) ;
|
||||||
|
JNIEnv *jenv = jnienv.getJNIEnv() ;
|
||||||
jobject jobj = swig_self_.peek();
|
jobject jobj = swig_self_.peek();
|
||||||
#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;
|
||||||
|
|
@ -143,7 +152,9 @@ namespace Swig {
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual ~Director() {
|
virtual ~Director() {
|
||||||
swig_self_.release(swig_acquire_jenv());
|
JNIEnvWrapper jnienv(this) ;
|
||||||
|
JNIEnv *jenv = jnienv.getJNIEnv() ;
|
||||||
|
swig_self_.release(jenv);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool swig_set_self(JNIEnv *jenv, jobject jself, bool mem_own, bool weak_global) {
|
bool swig_set_self(JNIEnv *jenv, jobject jself, bool mem_own, bool weak_global) {
|
||||||
|
|
|
||||||
|
|
@ -3155,7 +3155,8 @@ class JAVA : public Language {
|
||||||
String *jenvstr = NewString("jenv");
|
String *jenvstr = NewString("jenv");
|
||||||
String *jobjstr = NewString("jobj");
|
String *jobjstr = NewString("jobj");
|
||||||
|
|
||||||
Wrapper_add_localv(w, jenvstr, "JNIEnv *", jenvstr, "= (JNIEnv *) NULL", NIL);
|
Wrapper_add_localv(w, "jnienv", "JNIEnvWrapper", "jnienv(this)", NIL, NIL);
|
||||||
|
Wrapper_add_localv(w, jenvstr, "JNIEnv *", jenvstr, "= jnienv.getJNIEnv()", NIL);
|
||||||
Wrapper_add_localv(w, jobjstr, "jobject ", jobjstr, "= (jobject) NULL", NIL);
|
Wrapper_add_localv(w, jobjstr, "jobject ", jobjstr, "= (jobject) NULL", NIL);
|
||||||
Delete(jenvstr);
|
Delete(jenvstr);
|
||||||
Delete(jobjstr);
|
Delete(jobjstr);
|
||||||
|
|
@ -3174,7 +3175,6 @@ class JAVA : public Language {
|
||||||
Delete(super_call);
|
Delete(super_call);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
Printf(w->code, "jenv = swig_acquire_jenv();\n");
|
|
||||||
Printf(w->code, "SWIG_JavaThrowException(jenv, SWIG_JavaDirectorPureVirtual,\n");
|
Printf(w->code, "SWIG_JavaThrowException(jenv, SWIG_JavaDirectorPureVirtual,\n");
|
||||||
Printf(w->code, " \"Attempted to invoke pure virtual method %s::%s.\");\n",
|
Printf(w->code, " \"Attempted to invoke pure virtual method %s::%s.\");\n",
|
||||||
c_classname, name);
|
c_classname, name);
|
||||||
|
|
@ -3188,7 +3188,6 @@ class JAVA : public Language {
|
||||||
}
|
}
|
||||||
|
|
||||||
Printf(w->code, "}\n");
|
Printf(w->code, "}\n");
|
||||||
Printf(w->code, "jenv = swig_acquire_jenv();\n");
|
|
||||||
Printf(w->code, "jobj = swig_get_self(jenv);\n");
|
Printf(w->code, "jobj = swig_get_self(jenv);\n");
|
||||||
Printf(w->code, "if (jobj && jenv->IsSameObject(jobj, NULL) == JNI_FALSE) {\n");
|
Printf(w->code, "if (jobj && jenv->IsSameObject(jobj, NULL) == JNI_FALSE) {\n");
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue