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 --- gen/com/mcserver/R.java | 10 +++ jni/ToJava.h | 26 ++++-- jni/app-android.cpp | 63 ++++++++++++-- res/layout/main.xml | 36 +++++++- res/values/strings.xml | 7 +- src/com/mcserver/MCServerActivity.java | 155 +++++++++++++++++++++++++++++++-- 6 files changed, 273 insertions(+), 24 deletions(-) diff --git a/gen/com/mcserver/R.java b/gen/com/mcserver/R.java index cd1049662..ea4f4fc2a 100644 --- a/gen/com/mcserver/R.java +++ b/gen/com/mcserver/R.java @@ -14,7 +14,12 @@ public final class R { public static final int ic_launcher=0x7f020000; } public static final class id { + public static final int ip_address=0x7f050005; + public static final int server_status_text=0x7f050004; + public static final int start_server=0x7f050002; + public static final int stop_server=0x7f050003; public static final int textView1=0x7f050000; + public static final int textView2=0x7f050001; } public static final class layout { public static final int main=0x7f030000; @@ -22,5 +27,10 @@ public final class R { public static final class string { public static final int app_name=0x7f040001; public static final int hello=0x7f040000; + public static final int mcserver_is_not_running=0x7f040005; + public static final int mcserver_is_running=0x7f040004; + public static final int start=0x7f040002; + public static final int stop=0x7f040003; + public static final int your_ip=0x7f040006; } } 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 diff --git a/jni/app-android.cpp b/jni/app-android.cpp index 461f433bf..a6fb1baf2 100644 --- a/jni/app-android.cpp +++ b/jni/app-android.cpp @@ -21,16 +21,52 @@ cCriticalSection g_CriticalSection; JNIEnv* g_CurrentJNIEnv = 0; jobject g_JavaThread = 0; +JavaVM* g_JavaVM = 0; //jobject g_JavaActivity = 0; cRoot * pRoot = NULL; - - +class cMainThread : + public cIsThread +{ +public: + cMainThread() : + cIsThread("cMainThread") + { + //Start(); + __android_log_print(ANDROID_LOG_ERROR,"MCServer", "%s", "cMainThread"); + } + + void Stop(void) + { + m_ShouldTerminate = true; + Wait(); + } + +protected: + + virtual void Execute(void) override + { + __android_log_print(ANDROID_LOG_ERROR,"MCServer", "%s", "Execute"); + pRoot = new cRoot(); + pRoot->Start(); + delete pRoot; + } + +} ; + +cMainThread * pMainThread = NULL; + +jint JNI_OnLoad(JavaVM* vm, void* reserved) +{ + __android_log_print(ANDROID_LOG_ERROR,"MCServer", "%s", "JNI_OnLoad JNI_OnLoad JNI_OnLoad JNI_OnLoad"); + g_JavaVM = vm; + return JNI_VERSION_1_4; +} /* Called when program/activity is created */ -extern "C" void Java_com_mcserver_MainThread_NativeOnCreate( JNIEnv* env, jobject thiz ) +extern "C" void Java_com_mcserver_MCServerActivity_NativeOnCreate( JNIEnv* env, jobject thiz ) { g_CriticalSection.Lock(); g_CurrentJNIEnv = env; @@ -44,25 +80,40 @@ extern "C" void Java_com_mcserver_MainThread_NativeOnCreate( JNIEnv* env, jobje mkdir("/sdcard/mcserver", S_IRWXU | S_IRWXG | S_IRWXO); +// __android_log_print(ANDROID_LOG_ERROR,"MCServer", "%s", "Before mainthread"); +// pMainThread = new cMainThread(); +// pMainThread->Start(); +// __android_log_print(ANDROID_LOG_ERROR,"MCServer", "%s", "AFter mainthread"); + pRoot = new cRoot(); pRoot->Start(); - delete pRoot; + delete pRoot; pRoot = NULL; } -extern "C" void Java_com_mcserver_MainThread_NativeCleanUp( JNIEnv* env, jobject thiz ) +extern "C" void Java_com_mcserver_MCServerActivity_NativeCleanUp( JNIEnv* env, jobject thiz ) { g_CriticalSection.Lock(); g_CurrentJNIEnv = env; g_JavaThread = thiz; g_CriticalSection.Unlock(); - pRoot->ServerCommand("stop"); + __android_log_print(ANDROID_LOG_ERROR,"MCServer", "pRoot: %p", pRoot); + if( pRoot != NULL ) + { + pRoot->ServerCommand("stop"); + } +// pMainThread->Stop(); +// delete pMainThread; pMainThread = NULL; } +extern "C" jboolean Java_com_mcserver_MCServerActivity_NativeIsServerRunning( JNIEnv* env, jobject thiz ) +{ + return pRoot != NULL; +} \ No newline at end of file diff --git a/res/layout/main.xml b/res/layout/main.xml index e24cd5f23..b270bca03 100644 --- a/res/layout/main.xml +++ b/res/layout/main.xml @@ -2,12 +2,46 @@ - + + + +