diff --git a/contrib/mobile/androidGModel.cpp b/contrib/mobile/androidGModel.cpp
index 17ecf573e5ec0332b446ddc4ecab59b2f1d990d3..bd6b7847518c62841b47f4a788aada3dd3f9f0a9 100644
--- a/contrib/mobile/androidGModel.cpp
+++ b/contrib/mobile/androidGModel.cpp
@@ -20,7 +20,6 @@ onelab::server *getOnelab() {return onelab::server::instance();}
 extern "C"
 {
 static JavaVM *gJavaVM;
-static JNIEnv *env;
 static jobject gCallbackObject = NULL;
 };
 
@@ -37,10 +36,8 @@ class MobileMessage : public GmshMessage
 	 		LOGE("%s", message.c_str());
 			if(message.size() <= 26 || message.substr(message.size()-25,25) != "check the log for details")
 				return;
-			if(!gCallbackObject)
-				return;
-			if ((gJavaVM->AttachCurrentThread(&env, NULL)) < 0)
-				return;
+			JNIEnv *env;
+			if(gJavaVM->GetEnv(reinterpret_cast<void**>(&env), JNI_VERSION_1_6) != JNI_OK || !gCallbackObject || (gJavaVM->AttachCurrentThread(&env, NULL)) < 0) return;
 			jstring jstr = env->NewStringUTF(message.c_str());
 			jclass jClass = env->FindClass("org/geuz/onelab/Gmsh"); 
 			if(jClass == 0)
@@ -55,10 +52,8 @@ class MobileMessage : public GmshMessage
 		}
 		else if(level == "Progress")
 		{
-			if(!gCallbackObject)
-				return;
-			if ((gJavaVM->AttachCurrentThread(&env, NULL)) < 0)
-				return;
+			JNIEnv *env;
+			if(gJavaVM->GetEnv(reinterpret_cast<void**>(&env), JNI_VERSION_1_6) != JNI_OK || !gCallbackObject || (gJavaVM->AttachCurrentThread(&env, NULL)) < 0) return;
 			jstring jstr = env->NewStringUTF(message.c_str());
 			jclass jClass = env->FindClass("org/geuz/onelab/Gmsh"); 
 			if(jClass == 0)
@@ -82,10 +77,8 @@ class MobileMessage : public GmshMessage
 
 void requestRender()
 {
-	if(!gCallbackObject)
-		return;
-	if ((gJavaVM->AttachCurrentThread(&env, NULL)) < 0)
-		return;
+	JNIEnv *env;
+	if(gJavaVM->GetEnv(reinterpret_cast<void**>(&env), JNI_VERSION_1_6) != JNI_OK || !gCallbackObject || (gJavaVM->AttachCurrentThread(&env, NULL)) < 0) return;
 	jclass jClass = env->FindClass("org/geuz/onelab/Gmsh"); 
 	if(jClass == 0)
 		return;
@@ -98,7 +91,8 @@ void requestRender()
 
 void getBitmapFromString(const char *text, int textsize, unsigned char **map, int *height, int *width, int *realWidth)
 {
-	if(!gCallbackObject || (gJavaVM->AttachCurrentThread(&env, NULL)) < 0) return;
+	JNIEnv *env;
+	if(gJavaVM->GetEnv(reinterpret_cast<void**>(&env), JNI_VERSION_1_6) != JNI_OK || !gCallbackObject || (gJavaVM->AttachCurrentThread(&env, NULL)) < 0) return;
 	jclass jClass = env->FindClass("org/geuz/onelab/StringTexture"); 
 	if(jClass == 0)
 		return;
@@ -106,7 +100,7 @@ void getBitmapFromString(const char *text, int textsize, unsigned char **map, in
 	jmethodID mid = env->GetStaticMethodID(jClass, "getHeightFromString", "(Ljava/lang/String;I)I");
 	*height = env->CallIntMethod(gCallbackObject, mid, jtext, textsize);
 	mid = env->GetStaticMethodID(jClass, "getWidthFromString", "(Ljava/lang/String;I)I");
-	*width = env->CallIntMethod(gCallbackObject, mid, jtext, textsize);
+	*width =env->CallIntMethod(gCallbackObject, mid, jtext, textsize);
 	if(realWidth != NULL){
 		mid = env->GetStaticMethodID(jClass, "getRealWidthFromString", "(Ljava/lang/String;I)I");
 		*realWidth = env->CallIntMethod(gCallbackObject, mid, jtext, textsize);
@@ -117,6 +111,7 @@ void getBitmapFromString(const char *text, int textsize, unsigned char **map, in
 	*map = (unsigned char *) malloc((*height)*(*width));
 	env->GetByteArrayRegion(*jarray, 0, (*height)*(*width), (jbyte*)*map);
 	env->DeleteLocalRef(jClass);
+	env->DeleteLocalRef(jtext);
 }
 
 extern "C" {
@@ -127,6 +122,7 @@ JNIEXPORT jint JNI_OnLoad(JavaVM *vm, void *reserved) {
 JNIEXPORT jlong JNICALL Java_org_geuz_onelab_Gmsh_init
   (JNIEnv *env, jobject obj, jstring jname)
 {
+	if(gCallbackObject != NULL) env->DeleteGlobalRef(gCallbackObject);
 	gCallbackObject = env->NewGlobalRef(obj);
 	gJavaVM->GetEnv((void**)&env, JNI_VERSION_1_6);
 	Msg::SetCallback(new MobileMessage());
@@ -182,6 +178,7 @@ JNIEXPORT jobjectArray JNICALL Java_org_geuz_onelab_Gmsh_getParams
 	for(int i=0; i<tmp.size();i++){
 		jstring s = env->NewStringUTF(tmp[i].c_str());
 		env->SetObjectArrayElement(params, i, s);
+		env->DeleteLocalRef(s);
 	}
 	return params;
 }
@@ -218,6 +215,7 @@ JNIEXPORT jobjectArray JNICALL Java_org_geuz_onelab_Gmsh_getPView
 			<< "\n"  << PView::list[i]->getOptions()->nbIso;
 		jstring s = env->NewStringUTF(sstream.str().c_str());
 		env->SetObjectArrayElement(jPView, i, s);
+		env->DeleteLocalRef(s);
 	}
 	return jPView;
 }