From b6138129e668681d2c16146dea3d66b0ea2f0381 Mon Sep 17 00:00:00 2001 From: faketruth Date: Sat, 18 Aug 2012 21:00:51 +0000 Subject: Android: I'm probably using a lot of bad practices, but the app looks somewhat better now and polls the server status Android: Put quite some testing code in ToJava.h and app-android.cpp ... I still can't send log messages to Java. The issue is threads, I can't use JNI stuff from threads that were not created by Java (at least not easily) git-svn-id: http://mc-server.googlecode.com/svn/trunk@752 0a769ca7-a7f5-676a-18bf-c427514a06d6 --- jni/ToJava.h | 26 +++++++++++++++++++------- 1 file changed, 19 insertions(+), 7 deletions(-) (limited to 'jni/ToJava.h') diff --git a/jni/ToJava.h b/jni/ToJava.h index 59dc4c366..bc10f01e3 100644 --- a/jni/ToJava.h +++ b/jni/ToJava.h @@ -3,7 +3,7 @@ #include #include extern JNIEnv* g_CurrentJNIEnv; - +extern JavaVM* g_JavaVM; extern jobject g_JavaThread; //extern jobject g_JavaActivity; @@ -11,6 +11,12 @@ extern jobject g_JavaThread; static void CallJavaFunction_Void_String( jobject a_Object, const std::string & a_FunctionName, const std::string & a_StringParam ) { + JNIEnv * oldEnv = g_CurrentJNIEnv; + int status = g_JavaVM->AttachCurrentThread(&g_CurrentJNIEnv, NULL); + __android_log_print(ANDROID_LOG_ERROR,"MCServer", "STATUS: %i old: %p new: %p", status, oldEnv, g_CurrentJNIEnv ); + jstring str = g_CurrentJNIEnv->NewStringUTF( a_StringParam.c_str() ); + + //__android_log_print(ANDROID_LOG_ERROR,"MCServer", "JNIEnv: %i Object: %i", g_CurrentJNIEnv, a_Object ); jclass cls = g_CurrentJNIEnv->GetObjectClass( a_Object ); //__android_log_print(ANDROID_LOG_ERROR,"MCServer", "jclass: %i", cls ); @@ -18,26 +24,32 @@ static void CallJavaFunction_Void_String( jobject a_Object, const std::string & //__android_log_print(ANDROID_LOG_ERROR,"MCServer", "jmethodID: %i", mid ); if (mid != 0) { - //__android_log_print(ANDROID_LOG_ERROR,"MCServer", "Going to call right NOW! %s", a_FunctionName.c_str() ); - g_CurrentJNIEnv->CallVoidMethod( a_Object, mid, g_CurrentJNIEnv->NewStringUTF( a_StringParam.c_str() ) ); + + __android_log_print(ANDROID_LOG_ERROR,"MCServer", "Going to call right NOW! %s", a_FunctionName.c_str() ); + g_CurrentJNIEnv->CallVoidMethod( a_Object, mid, str ); } else { __android_log_print(ANDROID_LOG_ERROR,"MCServer", "It was 0, derp" ); } + + if( oldEnv != g_CurrentJNIEnv ) + { + g_JavaVM->DetachCurrentThread(); + } } static void CallJavaFunction_Void_Void( jobject a_Object, const std::string & a_FunctionName ) { - __android_log_print(ANDROID_LOG_ERROR,"MCServer", "JNIEnv: %i Object: %i", g_CurrentJNIEnv, a_Object ); + //__android_log_print(ANDROID_LOG_ERROR,"MCServer", "JNIEnv: %i Object: %i", g_CurrentJNIEnv, a_Object ); jclass cls = g_CurrentJNIEnv->GetObjectClass( a_Object ); - __android_log_print(ANDROID_LOG_ERROR,"MCServer", "jclass: %i", cls ); + //__android_log_print(ANDROID_LOG_ERROR,"MCServer", "jclass: %i", cls ); jmethodID mid = g_CurrentJNIEnv->GetMethodID( cls, a_FunctionName.c_str(), "()V"); // void a_FunctionName( String ) - __android_log_print(ANDROID_LOG_ERROR,"MCServer", "jmethodID: %i", mid ); + //__android_log_print(ANDROID_LOG_ERROR,"MCServer", "jmethodID: %i", mid ); if (mid != 0) { - __android_log_print(ANDROID_LOG_ERROR,"MCServer", "Going to call right NOW! %s", a_FunctionName.c_str() ); + //__android_log_print(ANDROID_LOG_ERROR,"MCServer", "Going to call right NOW! %s", a_FunctionName.c_str() ); g_CurrentJNIEnv->CallVoidMethod( a_Object, mid ); } else -- cgit v1.2.3