Pingan Yi 2014-05-04 19:10:44 +08:00
commit b79646ce4c
2 changed files with 9 additions and 0 deletions

View file

@ -380,5 +380,12 @@ namespace Swig {
return matches; return matches;
} }
class LocalRefGuard {
JNIEnv* jenv_;
jobject jobj_;
public:
LocalRefGuard(JNIEnv* jenv, jobject jobj): jenv_(jenv), jobj_(jobj) {}
~LocalRefGuard() { if (jobj_) jenv_->DeleteLocalRef(jobj_); }
};
} }

View file

@ -405,6 +405,7 @@ SWIGINTERN const char * SWIG_UnpackData(const char *c, void *ptr, size_t sz) {
$input = JCALL1(NewStringUTF, jenv, (const char *)$1); $input = JCALL1(NewStringUTF, jenv, (const char *)$1);
if (!$input) return $null; if (!$input) return $null;
} }
Swig::LocalRefGuard refGuard_$input(jenv, $input);
} }
%typemap(freearg, noblock=1) char * { if ($1) JCALL2(ReleaseStringUTFChars, jenv, $input, (const char *)$1); } %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); $input = JCALL1(NewStringUTF, jenv, (const char *)$1);
if (!$input) return $null; if (!$input) return $null;
} }
Swig::LocalRefGuard refGuard_$input(jenv, $input);
} }
%typemap(argout) char[ANY], char[] "" %typemap(argout) char[ANY], char[] ""