diff --git a/Lib/java/director.swg b/Lib/java/director.swg index 819ad903d..7f0fd3933 100644 --- a/Lib/java/director.swg +++ b/Lib/java/director.swg @@ -380,5 +380,12 @@ namespace Swig { return matches; } + class LocalRefGuard { + JNIEnv* jenv_; + jobject jobj_; + public: + LocalRefGuard(JNIEnv* jenv, jobject jobj): jenv_(jenv), jobj_(jobj) {} + ~LocalRefGuard() { if (jobj_) jenv_->DeleteLocalRef(jobj_); } + }; } diff --git a/Lib/java/java.swg b/Lib/java/java.swg index 3d4d83730..3ad0e7aba 100644 --- a/Lib/java/java.swg +++ b/Lib/java/java.swg @@ -405,6 +405,7 @@ SWIGINTERN const char * SWIG_UnpackData(const char *c, void *ptr, size_t sz) { $input = JCALL1(NewStringUTF, jenv, (const char *)$1); if (!$input) return $null; } + Swig::LocalRefGuard refGuard_$input(jenv, $input); } %typemap(freearg, noblock=1) char * { if ($1) JCALL2(ReleaseStringUTFChars, jenv, $input, (const char *)$1); } @@ -731,6 +732,7 @@ SWIGINTERN const char * SWIG_UnpackData(const char *c, void *ptr, size_t sz) { $input = JCALL1(NewStringUTF, jenv, (const char *)$1); if (!$input) return $null; } + Swig::LocalRefGuard refGuard_$input(jenv, $input); } %typemap(argout) char[ANY], char[] ""