Skip to content
Snippets Groups Projects
Commit 6212508a authored by Maxime Graulich's avatar Maxime Graulich
Browse files

Fix JNI crashes (Android)

parent 687dc8a9
No related branches found
No related tags found
No related merge requests found
...@@ -20,7 +20,6 @@ onelab::server *getOnelab() {return onelab::server::instance();} ...@@ -20,7 +20,6 @@ onelab::server *getOnelab() {return onelab::server::instance();}
extern "C" extern "C"
{ {
static JavaVM *gJavaVM; static JavaVM *gJavaVM;
static JNIEnv *env;
static jobject gCallbackObject = NULL; static jobject gCallbackObject = NULL;
}; };
...@@ -37,10 +36,8 @@ class MobileMessage : public GmshMessage ...@@ -37,10 +36,8 @@ class MobileMessage : public GmshMessage
LOGE("%s", message.c_str()); LOGE("%s", message.c_str());
if(message.size() <= 26 || message.substr(message.size()-25,25) != "check the log for details") if(message.size() <= 26 || message.substr(message.size()-25,25) != "check the log for details")
return; return;
if(!gCallbackObject) JNIEnv *env;
return; if(gJavaVM->GetEnv(reinterpret_cast<void**>(&env), JNI_VERSION_1_6) != JNI_OK || !gCallbackObject || (gJavaVM->AttachCurrentThread(&env, NULL)) < 0) return;
if ((gJavaVM->AttachCurrentThread(&env, NULL)) < 0)
return;
jstring jstr = env->NewStringUTF(message.c_str()); jstring jstr = env->NewStringUTF(message.c_str());
jclass jClass = env->FindClass("org/geuz/onelab/Gmsh"); jclass jClass = env->FindClass("org/geuz/onelab/Gmsh");
if(jClass == 0) if(jClass == 0)
...@@ -55,10 +52,8 @@ class MobileMessage : public GmshMessage ...@@ -55,10 +52,8 @@ class MobileMessage : public GmshMessage
} }
else if(level == "Progress") else if(level == "Progress")
{ {
if(!gCallbackObject) JNIEnv *env;
return; if(gJavaVM->GetEnv(reinterpret_cast<void**>(&env), JNI_VERSION_1_6) != JNI_OK || !gCallbackObject || (gJavaVM->AttachCurrentThread(&env, NULL)) < 0) return;
if ((gJavaVM->AttachCurrentThread(&env, NULL)) < 0)
return;
jstring jstr = env->NewStringUTF(message.c_str()); jstring jstr = env->NewStringUTF(message.c_str());
jclass jClass = env->FindClass("org/geuz/onelab/Gmsh"); jclass jClass = env->FindClass("org/geuz/onelab/Gmsh");
if(jClass == 0) if(jClass == 0)
...@@ -82,10 +77,8 @@ class MobileMessage : public GmshMessage ...@@ -82,10 +77,8 @@ class MobileMessage : public GmshMessage
void requestRender() void requestRender()
{ {
if(!gCallbackObject) JNIEnv *env;
return; if(gJavaVM->GetEnv(reinterpret_cast<void**>(&env), JNI_VERSION_1_6) != JNI_OK || !gCallbackObject || (gJavaVM->AttachCurrentThread(&env, NULL)) < 0) return;
if ((gJavaVM->AttachCurrentThread(&env, NULL)) < 0)
return;
jclass jClass = env->FindClass("org/geuz/onelab/Gmsh"); jclass jClass = env->FindClass("org/geuz/onelab/Gmsh");
if(jClass == 0) if(jClass == 0)
return; return;
...@@ -98,7 +91,8 @@ void requestRender() ...@@ -98,7 +91,8 @@ void requestRender()
void getBitmapFromString(const char *text, int textsize, unsigned char **map, int *height, int *width, int *realWidth) 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"); jclass jClass = env->FindClass("org/geuz/onelab/StringTexture");
if(jClass == 0) if(jClass == 0)
return; return;
...@@ -106,7 +100,7 @@ void getBitmapFromString(const char *text, int textsize, unsigned char **map, in ...@@ -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"); jmethodID mid = env->GetStaticMethodID(jClass, "getHeightFromString", "(Ljava/lang/String;I)I");
*height = env->CallIntMethod(gCallbackObject, mid, jtext, textsize); *height = env->CallIntMethod(gCallbackObject, mid, jtext, textsize);
mid = env->GetStaticMethodID(jClass, "getWidthFromString", "(Ljava/lang/String;I)I"); 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){ if(realWidth != NULL){
mid = env->GetStaticMethodID(jClass, "getRealWidthFromString", "(Ljava/lang/String;I)I"); mid = env->GetStaticMethodID(jClass, "getRealWidthFromString", "(Ljava/lang/String;I)I");
*realWidth = env->CallIntMethod(gCallbackObject, mid, jtext, textsize); *realWidth = env->CallIntMethod(gCallbackObject, mid, jtext, textsize);
...@@ -117,6 +111,7 @@ void getBitmapFromString(const char *text, int textsize, unsigned char **map, in ...@@ -117,6 +111,7 @@ void getBitmapFromString(const char *text, int textsize, unsigned char **map, in
*map = (unsigned char *) malloc((*height)*(*width)); *map = (unsigned char *) malloc((*height)*(*width));
env->GetByteArrayRegion(*jarray, 0, (*height)*(*width), (jbyte*)*map); env->GetByteArrayRegion(*jarray, 0, (*height)*(*width), (jbyte*)*map);
env->DeleteLocalRef(jClass); env->DeleteLocalRef(jClass);
env->DeleteLocalRef(jtext);
} }
extern "C" { extern "C" {
...@@ -127,6 +122,7 @@ JNIEXPORT jint JNI_OnLoad(JavaVM *vm, void *reserved) { ...@@ -127,6 +122,7 @@ JNIEXPORT jint JNI_OnLoad(JavaVM *vm, void *reserved) {
JNIEXPORT jlong JNICALL Java_org_geuz_onelab_Gmsh_init JNIEXPORT jlong JNICALL Java_org_geuz_onelab_Gmsh_init
(JNIEnv *env, jobject obj, jstring jname) (JNIEnv *env, jobject obj, jstring jname)
{ {
if(gCallbackObject != NULL) env->DeleteGlobalRef(gCallbackObject);
gCallbackObject = env->NewGlobalRef(obj); gCallbackObject = env->NewGlobalRef(obj);
gJavaVM->GetEnv((void**)&env, JNI_VERSION_1_6); gJavaVM->GetEnv((void**)&env, JNI_VERSION_1_6);
Msg::SetCallback(new MobileMessage()); Msg::SetCallback(new MobileMessage());
...@@ -182,6 +178,7 @@ JNIEXPORT jobjectArray JNICALL Java_org_geuz_onelab_Gmsh_getParams ...@@ -182,6 +178,7 @@ JNIEXPORT jobjectArray JNICALL Java_org_geuz_onelab_Gmsh_getParams
for(int i=0; i<tmp.size();i++){ for(int i=0; i<tmp.size();i++){
jstring s = env->NewStringUTF(tmp[i].c_str()); jstring s = env->NewStringUTF(tmp[i].c_str());
env->SetObjectArrayElement(params, i, s); env->SetObjectArrayElement(params, i, s);
env->DeleteLocalRef(s);
} }
return params; return params;
} }
...@@ -218,6 +215,7 @@ JNIEXPORT jobjectArray JNICALL Java_org_geuz_onelab_Gmsh_getPView ...@@ -218,6 +215,7 @@ JNIEXPORT jobjectArray JNICALL Java_org_geuz_onelab_Gmsh_getPView
<< "\n" << PView::list[i]->getOptions()->nbIso; << "\n" << PView::list[i]->getOptions()->nbIso;
jstring s = env->NewStringUTF(sstream.str().c_str()); jstring s = env->NewStringUTF(sstream.str().c_str());
env->SetObjectArrayElement(jPView, i, s); env->SetObjectArrayElement(jPView, i, s);
env->DeleteLocalRef(s);
} }
return jPView; return jPView;
} }
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment