diff --git a/AndroidManifest.xml b/AndroidManifest.xml index e9613f36c..69f71fcf4 100644 --- a/AndroidManifest.xml +++ b/AndroidManifest.xml @@ -6,7 +6,9 @@ - + + + @@ -20,17 +21,22 @@ cCriticalSection g_CriticalSection; JNIEnv* g_CurrentJNIEnv = 0; jobject g_JavaRenderer = 0; +cRoot * pRoot = NULL; + /* Called when program/activity is created */ extern "C" void Java_com_mcserver_MainThread_NativeOnCreate( JNIEnv* env ) { g_CriticalSection.Lock(); g_CurrentJNIEnv = env; //if( !cLogger::GetSingletonPtr() ) new cLogger(); - __android_log_print(ANDROID_LOG_ERROR,"Arashi", "%s", "Logging from C++!"); + __android_log_print(ANDROID_LOG_ERROR,"MCServer", "%s", "Logging from C++!"); g_CriticalSection.Unlock(); - cRoot Root; - Root.Start(); + mkdir("/sdcard/mcserver", S_IRWXU | S_IRWXG | S_IRWXO); + + pRoot = new cRoot(); + pRoot->Start(); + delete pRoot; } extern "C" void Java_com_mcserver_MCServerActivity_NativeCleanUp( JNIEnv* env ) @@ -39,6 +45,8 @@ extern "C" void Java_com_mcserver_MCServerActivity_NativeCleanUp( JNIEnv* env ) g_CurrentJNIEnv = env; g_CriticalSection.Unlock(); + + pRoot->ServerCommand("stop"); } /* Call to initialize the graphics state */ diff --git a/res/layout/main.xml b/res/layout/main.xml index ac9c0abab..e24cd5f23 100644 --- a/res/layout/main.xml +++ b/res/layout/main.xml @@ -3,8 +3,9 @@ android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="vertical" > - + diff --git a/source/Globals.h b/source/Globals.h index 4816e2769..7d51bd52f 100644 --- a/source/Globals.h +++ b/source/Globals.h @@ -123,6 +123,12 @@ typedef short Int16; #define USE_SQUIRREL #endif +#if defined(ANDROID_NDK) + #define FILE_IO_PREFIX "/sdcard/mcserver/" +#else + #define FILE_IO_PREFIX "" +#endif + diff --git a/source/cFile.cpp b/source/cFile.cpp index 32de28fe0..5558bfd45 100644 --- a/source/cFile.cpp +++ b/source/cFile.cpp @@ -76,14 +76,14 @@ bool cFile::Open(const AString & iFileName, EMode iMode) return false; } } - m_File = fopen(iFileName.c_str(), Mode); + m_File = fopen( (FILE_IO_PREFIX + iFileName).c_str(), Mode); if ((m_File == NULL) && (iMode == fmReadWrite)) { // Fix for MS not following C spec, opening "a" mode files for writing at the end only // The file open operation has been tried with "read update", fails if file not found // So now we know either the file doesn't exist or we don't have rights, no need to worry about file contents. // Simply re-open for read-writing, erasing existing contents: - m_File = fopen(iFileName.c_str(), "wb+"); + m_File = fopen( (FILE_IO_PREFIX + iFileName).c_str(), "wb+"); } return (m_File != NULL); } diff --git a/source/cLog.cpp b/source/cLog.cpp index 372616be8..d1874f7e2 100644 --- a/source/cLog.cpp +++ b/source/cLog.cpp @@ -26,7 +26,7 @@ cLog::cLog(const AString & a_FileName ) // create logs directory cMakeDir::MakeDir("logs"); - OpenLog( (std::string("logs/") + a_FileName).c_str() ); + OpenLog( (FILE_IO_PREFIX + std::string("logs/") + a_FileName).c_str() ); } @@ -100,10 +100,6 @@ void cLog::ClearLog() void cLog::Log(const char * a_Format, va_list argList) { -#if defined(ANDROID_NDK) - __android_log_vprint(ANDROID_LOG_ERROR,"MCServer", a_Format, argList); - return; // This is as far as android goes -#endif AString Message; AppendVPrintf(Message, a_Format, argList); @@ -132,8 +128,12 @@ void cLog::Log(const char * a_Format, va_list argList) } // Print to console: +#if defined(ANDROID_NDK) + __android_log_vprint(ANDROID_LOG_ERROR,"MCServer", a_Format, argList); +#else printf("%s", Line.c_str()); - +#endif + #if defined (_WIN32) && defined(_DEBUG) // In a Windows Debug build, output the log to debug console as well: OutputDebugString(Line.c_str()); diff --git a/source/cMakeDir.cpp b/source/cMakeDir.cpp index a9e35cece..478d1d872 100644 --- a/source/cMakeDir.cpp +++ b/source/cMakeDir.cpp @@ -14,9 +14,9 @@ void cMakeDir::MakeDir(const AString & a_Directory) Attrib.nLength = sizeof(SECURITY_ATTRIBUTES); Attrib.lpSecurityDescriptor = NULL; Attrib.bInheritHandle = false; - ::CreateDirectory(a_Directory.c_str(), &Attrib); + ::CreateDirectory( (FILE_IO_PREFIX + a_Directory).c_str(), &Attrib); #else - mkdir(a_Directory.c_str(), S_IRWXU | S_IRWXG | S_IRWXO); + mkdir( (FILE_IO_PREFIX + a_Directory).c_str(), S_IRWXU | S_IRWXG | S_IRWXO); #endif } diff --git a/source/cRoot.cpp b/source/cRoot.cpp index 317b03ca3..81e7daccb 100644 --- a/source/cRoot.cpp +++ b/source/cRoot.cpp @@ -77,6 +77,9 @@ cRoot::~cRoot() void cRoot::InputThread(void* a_Params) { +#if defined(ANDROID_NDK) + return; +#else cRoot& self = *(cRoot*)a_Params; while( !(self.m_bStop || self.m_bRestart) ) @@ -85,6 +88,7 @@ void cRoot::InputThread(void* a_Params) std::getline(std::cin, Command); self.ServerCommand( Command.c_str() ); } +#endif } diff --git a/src/com/mcserver/MCServerActivity.java b/src/com/mcserver/MCServerActivity.java index 225ba7a94..f7bfc76e3 100644 --- a/src/com/mcserver/MCServerActivity.java +++ b/src/com/mcserver/MCServerActivity.java @@ -2,6 +2,7 @@ package com.mcserver; import android.app.Activity; import android.os.Bundle; +import android.view.KeyEvent; public class MCServerActivity extends Activity { /** Called when the activity is first created. */ @@ -12,16 +13,25 @@ public class MCServerActivity extends Activity { MainThread p = new MainThread(); p.start(); - - //NativeOnCreate(); } + public boolean onKeyDown(int keyCode, KeyEvent event) + { + if(keyCode==KeyEvent.KEYCODE_BACK) + { + //android.os.Process.killProcess(android.os.Process.myPid()); + NativeCleanUp(); + return super.onKeyDown(keyCode, event); + } + return false; + } static { System.loadLibrary("mcserver"); } - private static native void NativeOnCreate(); + private static native void NativeCleanUp(); + }