diff --git a/.classpath b/.classpath new file mode 100644 index 000000000..a4f1e4054 --- /dev/null +++ b/.classpath @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/.project b/.project new file mode 100644 index 000000000..34dd17184 --- /dev/null +++ b/.project @@ -0,0 +1,33 @@ + + + MCServer + + + + + + com.android.ide.eclipse.adt.ResourceManagerBuilder + + + + + com.android.ide.eclipse.adt.PreCompilerBuilder + + + + + org.eclipse.jdt.core.javabuilder + + + + + com.android.ide.eclipse.adt.ApkBuilder + + + + + + com.android.ide.eclipse.adt.AndroidNature + org.eclipse.jdt.core.javanature + + diff --git a/.settings/org.eclipse.jdt.core.prefs b/.settings/org.eclipse.jdt.core.prefs new file mode 100644 index 000000000..da5d06089 --- /dev/null +++ b/.settings/org.eclipse.jdt.core.prefs @@ -0,0 +1,4 @@ +eclipse.preferences.version=1 +org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.5 +org.eclipse.jdt.core.compiler.compliance=1.5 +org.eclipse.jdt.core.compiler.source=1.5 diff --git a/AndroidManifest.xml b/AndroidManifest.xml new file mode 100644 index 000000000..e9613f36c --- /dev/null +++ b/AndroidManifest.xml @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/WebServer/Socket.cpp b/WebServer/Socket.cpp index 2dde93b22..82c76a8f1 100644 --- a/WebServer/Socket.cpp +++ b/WebServer/Socket.cpp @@ -98,7 +98,9 @@ Socket::Socket() : if (!IsValid()) { +#if !defined(ANDROID_NDK) throw "INVALID_SOCKET"; +#endif } refCounter_ = new int(1); @@ -354,7 +356,9 @@ SocketSelect::SocketSelect(Socket const * const s1, Socket const * const s2, Typ } if (select(Highest + 1, &fds_, NULL, NULL, NULL) == SOCKET_ERROR) { +#if !defined(ANDROID_NDK) throw "Error in select"; +#endif } } diff --git a/WebServer/base64.cpp b/WebServer/base64.cpp index 4c19b600b..f505ea6c3 100644 --- a/WebServer/base64.cpp +++ b/WebServer/base64.cpp @@ -3,6 +3,9 @@ #include "base64.h" #include +#if defined(ANDROID_NDK) +#include +#endif static const std::string base64_chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZ" diff --git a/gen/com/mcserver/BuildConfig.java b/gen/com/mcserver/BuildConfig.java new file mode 100644 index 000000000..e40837927 --- /dev/null +++ b/gen/com/mcserver/BuildConfig.java @@ -0,0 +1,6 @@ +/** Automatically generated file. DO NOT MODIFY */ +package com.mcserver; + +public final class BuildConfig { + public final static boolean DEBUG = true; +} \ No newline at end of file diff --git a/gen/com/mcserver/R.java b/gen/com/mcserver/R.java new file mode 100644 index 000000000..3cbfd936d --- /dev/null +++ b/gen/com/mcserver/R.java @@ -0,0 +1,23 @@ +/* AUTO-GENERATED FILE. DO NOT MODIFY. + * + * This class was automatically generated by the + * aapt tool from the resource data it found. It + * should not be modified by hand. + */ + +package com.mcserver; + +public final class R { + public static final class attr { + } + public static final class drawable { + public static final int ic_launcher=0x7f020000; + } + public static final class layout { + public static final int main=0x7f030000; + } + public static final class string { + public static final int app_name=0x7f040001; + public static final int hello=0x7f040000; + } +} diff --git a/jni/Android.mk b/jni/Android.mk new file mode 100644 index 000000000..b55990005 --- /dev/null +++ b/jni/Android.mk @@ -0,0 +1,44 @@ +LOCAL_PATH := $(call my-dir) + +include $(CLEAR_VARS) +LOCAL_MODULE := mcserver + + + +LOCAL_SRC_FILES := $(shell find lua-5.1.4 jsoncpp-src-0.5.0 zlib-1.2.7 source squirrel_3_0_1_stable tolua++-1.0.93 iniFile WebServer '(' -name '*.cpp' -o -name '*.c' ')') +LOCAL_SRC_FILES := $(filter-out %SquirrelFunctions.cpp %SquirrelBindings.cpp %cPlugin_Squirrel.cpp %cSquirrelCommandBinder.cpp %minigzip.c %lua.c %tolua.c %toluabind.c %LeakFinder.cpp %StackWalker.cpp %example.c,$(LOCAL_SRC_FILES)) +LOCAL_SRC_FILES := $(patsubst %.cpp,../%.cpp,$(LOCAL_SRC_FILES)) +LOCAL_SRC_FILES := $(patsubst %.c,../%.c,$(LOCAL_SRC_FILES)) +LOCAL_SRC_FILES += app-android.cpp + +LOCAL_CFLAGS := -DANDROID_NDK \ + -ffast-math \ + -O3 \ + -funroll-loops \ + -mfloat-abi=softfp -mfpu=neon \ + + +LOCAL_STATIC_LIBRARIES := cpufeatures + +LOCAL_C_INCLUDES := ./source \ + ./source/md5 \ + ./WebServer \ + ./source/packets \ + ./source/items \ + ./source/blocks \ + ./tolua++-1.0.93/src/lib \ + ./lua-5.1.4/src \ + ./zlib-1.2.7 \ + ./iniFile \ + ./tolua++-1.0.93/include \ + ./jsoncpp-src-0.5.0/include \ + ./jsoncpp-src-0.5.0/src/lib_json \ + ./squirrel_3_0_1_stable/include \ + ./squirrel_3_0_1_stable \ + ./squirrel_3_0_1_stable/sqrat \ + + +LOCAL_LDLIBS := -ldl -llog + +include $(BUILD_SHARED_LIBRARY) +$(call import-module,cpufeatures) diff --git a/jni/Application.mk b/jni/Application.mk new file mode 100644 index 000000000..c68dfe204 --- /dev/null +++ b/jni/Application.mk @@ -0,0 +1,4 @@ +# Build both ARMv5TE and ARMv7-A machine code. +APP_MODULES := mcserver +# APP_ABI := armeabi armeabi-v7a +APP_STL := stlport_static \ No newline at end of file diff --git a/jni/app-android.cpp b/jni/app-android.cpp new file mode 100644 index 000000000..d874f0fb0 --- /dev/null +++ b/jni/app-android.cpp @@ -0,0 +1,87 @@ +#include "Globals.h" + +#include +#include +#include +#include + +#include +#include +#include +#include + +#include "cCriticalSection.h" +#include "cRoot.h" + +#include + +cCriticalSection g_CriticalSection; + +JNIEnv* g_CurrentJNIEnv = 0; +jobject g_JavaRenderer = 0; + +/* 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++!"); + g_CriticalSection.Unlock(); + + cRoot Root; + Root.Start(); +} + +extern "C" void Java_com_mcserver_MCServerActivity_NativeCleanUp( JNIEnv* env ) +{ + g_CriticalSection.Lock(); + g_CurrentJNIEnv = env; + + g_CriticalSection.Unlock(); +} + +/* Call to initialize the graphics state */ +extern "C" void Java_com_ballz_CppWrapperRenderer_NativeInitGL( JNIEnv* env, jobject thiz ) +{ + g_CriticalSection.Lock(); + g_CurrentJNIEnv = env; + g_JavaRenderer = thiz; + + g_CriticalSection.Unlock(); +} + +extern "C" void Java_com_ballz_CppWrapperRenderer_NativeResize( JNIEnv* env, jobject thiz, jint w, jint h ) +{ + g_CriticalSection.Lock(); + g_CurrentJNIEnv = env; + g_JavaRenderer = thiz; + + g_CriticalSection.Unlock(); +} + +extern "C" void Java_com_ballz_CppWrapperRenderer_NativeRender( JNIEnv* env, jobject thiz ) +{ + g_CriticalSection.Lock(); + g_CurrentJNIEnv = env; + g_JavaRenderer = thiz; + + + g_CriticalSection.Unlock(); +} + +extern "C" void Java_com_ballz_CppWrapperGLSurfaceView_NativeTouchScreen( JNIEnv* env, jobject thiz, jint mouseid, jint touched ) +{ + g_CriticalSection.Lock(); + g_CurrentJNIEnv = env; + + g_CriticalSection.Unlock(); +} + +extern "C" void Java_com_ballz_CppWrapperGLSurfaceView_NativeTouchEvent( JNIEnv* env, jobject thiz, jint mouseid, jfloat x, jfloat y ) +{ + g_CriticalSection.Lock(); + g_CurrentJNIEnv = env; + + g_CriticalSection.Unlock(); +} \ No newline at end of file diff --git a/jsoncpp-src-0.5.0/src/lib_json/json_reader.cpp b/jsoncpp-src-0.5.0/src/lib_json/json_reader.cpp index 4eb2d11fd..7c94e612e 100644 --- a/jsoncpp-src-0.5.0/src/lib_json/json_reader.cpp +++ b/jsoncpp-src-0.5.0/src/lib_json/json_reader.cpp @@ -871,13 +871,13 @@ Reader::getFormatedErrorMessages() const return formattedMessage; } - +#define JSON_ASSERT( condition ) assert( condition ); std::istream& operator>>( std::istream &sin, Value &root ) { Json::Reader reader; bool ok = reader.parse(sin, root, true); - //JSON_ASSERT( ok ); - if (!ok) throw std::runtime_error(reader.getFormatedErrorMessages()); + JSON_ASSERT( ok ); + //if (!ok) throw std::runtime_error(reader.getFormatedErrorMessages()); return sin; } diff --git a/jsoncpp-src-0.5.0/src/lib_json/json_value.cpp b/jsoncpp-src-0.5.0/src/lib_json/json_value.cpp index 573205f13..89271cd00 100644 --- a/jsoncpp-src-0.5.0/src/lib_json/json_value.cpp +++ b/jsoncpp-src-0.5.0/src/lib_json/json_value.cpp @@ -153,7 +153,8 @@ Value::CommentInfo::setComment( const char *text ) if ( comment_ ) valueAllocator()->releaseStringValue( comment_ ); JSON_ASSERT( text ); - JSON_ASSERT_MESSAGE( text[0]=='\0' || text[0]=='/', "Comments must start with /"); + //JSON_ASSERT_MESSAGE( text[0]=='\0' || text[0]=='/', "Comments must start with /"); + JSON_ASSERT( text[0]=='\0' || text[0]=='/' ); // It seems that /**/ style comments are acceptable as well. comment_ = valueAllocator()->duplicateStringValue( text ); } @@ -697,7 +698,8 @@ Value::asString() const case realValue: case arrayValue: case objectValue: - JSON_ASSERT_MESSAGE( false, "Type is not convertible to string" ); + //JSON_ASSERT_MESSAGE( false, "Type is not convertible to string" ); + JSON_ASSERT( false ); default: JSON_ASSERT_UNREACHABLE; } @@ -722,17 +724,20 @@ Value::asInt() const case intValue: return value_.int_; case uintValue: - JSON_ASSERT_MESSAGE( value_.uint_ < (unsigned)maxInt, "integer out of signed integer range" ); + //JSON_ASSERT_MESSAGE( value_.uint_ < (unsigned)maxInt, "integer out of signed integer range" ); + JSON_ASSERT( value_.uint_ < (unsigned)maxInt ); return value_.uint_; case realValue: - JSON_ASSERT_MESSAGE( value_.real_ >= minInt && value_.real_ <= maxInt, "Real out of signed integer range" ); + //JSON_ASSERT_MESSAGE( value_.real_ >= minInt && value_.real_ <= maxInt, "Real out of signed integer range" ); + JSON_ASSERT( value_.real_ >= minInt && value_.real_ <= maxInt ); return Int( value_.real_ ); case booleanValue: return value_.bool_ ? 1 : 0; case stringValue: case arrayValue: case objectValue: - JSON_ASSERT_MESSAGE( false, "Type is not convertible to int" ); + //JSON_ASSERT_MESSAGE( false, "Type is not convertible to int" ); + JSON_ASSERT( false ); default: JSON_ASSERT_UNREACHABLE; } @@ -747,19 +752,22 @@ Value::asUInt() const case nullValue: return 0; case intValue: - JSON_ASSERT_MESSAGE( value_.int_ >= 0, "Negative integer can not be converted to unsigned integer" ); + //JSON_ASSERT_MESSAGE( value_.int_ >= 0, "Negative integer can not be converted to unsigned integer" ); + JSON_ASSERT( value_.int_ >= 0 ); return value_.int_; case uintValue: return value_.uint_; case realValue: - JSON_ASSERT_MESSAGE( value_.real_ >= 0 && value_.real_ <= maxUInt, "Real out of unsigned integer range" ); + //JSON_ASSERT_MESSAGE( value_.real_ >= 0 && value_.real_ <= maxUInt, "Real out of unsigned integer range" ); + JSON_ASSERT( value_.real_ >= 0 && value_.real_ <= maxUInt ); return UInt( value_.real_ ); case booleanValue: return value_.bool_ ? 1 : 0; case stringValue: case arrayValue: case objectValue: - JSON_ASSERT_MESSAGE( false, "Type is not convertible to uint" ); + //JSON_ASSERT_MESSAGE( false, "Type is not convertible to uint" ); + JSON_ASSERT( false ); default: JSON_ASSERT_UNREACHABLE; } @@ -784,7 +792,8 @@ Value::asDouble() const case stringValue: case arrayValue: case objectValue: - JSON_ASSERT_MESSAGE( false, "Type is not convertible to double" ); + //JSON_ASSERT_MESSAGE( false, "Type is not convertible to double" ); + JSON_ASSERT( false ); default: JSON_ASSERT_UNREACHABLE; } diff --git a/lua-5.1.4/src/llex.c b/lua-5.1.4/src/llex.c index 6dc319358..02849fa8f 100644 --- a/lua-5.1.4/src/llex.c +++ b/lua-5.1.4/src/llex.c @@ -176,9 +176,13 @@ static void buffreplace (LexState *ls, char from, char to) { static void trydecpoint (LexState *ls, SemInfo *seminfo) { /* format error: try to update decimal point separator */ - struct lconv *cv = localeconv(); char old = ls->decpoint; +#if defined(ANDROID_NDK) + ls->decpoint = '.'; +#else + struct lconv *cv = localeconv(); ls->decpoint = (cv ? cv->decimal_point[0] : '.'); +#endif buffreplace(ls, old, ls->decpoint); /* try updated decimal separator */ if (!luaO_str2d(luaZ_buffer(ls->buff), &seminfo->r)) { /* format error with correct decimal point: no more options */ diff --git a/proguard-project.txt b/proguard-project.txt new file mode 100644 index 000000000..f2fe1559a --- /dev/null +++ b/proguard-project.txt @@ -0,0 +1,20 @@ +# To enable ProGuard in your project, edit project.properties +# to define the proguard.config property as described in that file. +# +# Add project specific ProGuard rules here. +# By default, the flags in this file are appended to flags specified +# in ${sdk.dir}/tools/proguard/proguard-android.txt +# You can edit the include path and order by changing the ProGuard +# include property in project.properties. +# +# For more details, see +# http://developer.android.com/guide/developing/tools/proguard.html + +# Add any project specific keep options here: + +# If your project uses WebView with JS, uncomment the following +# and specify the fully qualified class name to the JavaScript interface +# class: +#-keepclassmembers class fqcn.of.javascript.interface.for.webview { +# public *; +#} diff --git a/project.properties b/project.properties new file mode 100644 index 000000000..7a6518b77 --- /dev/null +++ b/project.properties @@ -0,0 +1,14 @@ +# This file is automatically generated by Android Tools. +# Do not modify this file -- YOUR CHANGES WILL BE ERASED! +# +# This file must be checked in Version Control Systems. +# +# To customize properties used by the Ant build system edit +# "ant.properties", and override values to adapt the script to your +# project structure. +# +# To enable ProGuard to shrink and obfuscate your code, uncomment this (available properties: sdk.dir, user.home): +#proguard.config=${sdk.dir}\tools\proguard\proguard-android.txt:proguard-project.txt + +# Project target. +target=android-12 diff --git a/res/drawable-hdpi/ic_launcher.png b/res/drawable-hdpi/ic_launcher.png new file mode 100644 index 000000000..96a442e5b Binary files /dev/null and b/res/drawable-hdpi/ic_launcher.png differ diff --git a/res/drawable-ldpi/ic_launcher.png b/res/drawable-ldpi/ic_launcher.png new file mode 100644 index 000000000..99238729d Binary files /dev/null and b/res/drawable-ldpi/ic_launcher.png differ diff --git a/res/drawable-mdpi/ic_launcher.png b/res/drawable-mdpi/ic_launcher.png new file mode 100644 index 000000000..359047dfa Binary files /dev/null and b/res/drawable-mdpi/ic_launcher.png differ diff --git a/res/drawable-xhdpi/ic_launcher.png b/res/drawable-xhdpi/ic_launcher.png new file mode 100644 index 000000000..71c6d760f Binary files /dev/null and b/res/drawable-xhdpi/ic_launcher.png differ diff --git a/res/layout/main.xml b/res/layout/main.xml new file mode 100644 index 000000000..ac9c0abab --- /dev/null +++ b/res/layout/main.xml @@ -0,0 +1,12 @@ + + + + + + \ No newline at end of file diff --git a/res/values/strings.xml b/res/values/strings.xml new file mode 100644 index 000000000..8c782a739 --- /dev/null +++ b/res/values/strings.xml @@ -0,0 +1,7 @@ + + + + Hello World, MCServerActivity! + MCServer + + \ No newline at end of file diff --git a/source/Globals.h b/source/Globals.h index 12cdd8c94..4816e2769 100644 --- a/source/Globals.h +++ b/source/Globals.h @@ -114,8 +114,14 @@ typedef short Int16; #include #include #include +#if !defined(ANDROID_NDK) #include #endif +#endif + +#if !defined(ANDROID_NDK) + #define USE_SQUIRREL +#endif diff --git a/source/StringUtils.cpp b/source/StringUtils.cpp index 652c680c7..fa61a61e7 100644 --- a/source/StringUtils.cpp +++ b/source/StringUtils.cpp @@ -5,6 +5,9 @@ #include "Globals.h" +#if defined(ANDROID_NDK) +#include +#endif diff --git a/source/cLog.cpp b/source/cLog.cpp index 5e79b48bf..372616be8 100644 --- a/source/cLog.cpp +++ b/source/cLog.cpp @@ -9,6 +9,9 @@ #include "cIsThread.h" +#if defined(ANDROID_NDK) +#include +#endif @@ -97,6 +100,10 @@ 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); diff --git a/source/cPluginManager.cpp b/source/cPluginManager.cpp index 64f6442ca..a722520bf 100644 --- a/source/cPluginManager.cpp +++ b/source/cPluginManager.cpp @@ -4,20 +4,21 @@ #include "cPlugin.h" #include "cPlugin_Lua.h" #include "cPlugin_NewLua.h" -#include "cPlugin_Squirrel.h" #include "cWebAdmin.h" #include "cItem.h" #include "cRoot.h" #include "cLuaCommandBinder.h" -#include "cSquirrelCommandBinder.h" +#if USE_SQUIRREL +# include "cPlugin_Squirrel.h" +# include "cSquirrelCommandBinder.h" +#endif #include "../iniFile/iniFile.h" #include "tolua++.h" #include "cPlayer.h" -#include "squirrelbindings/SquirrelBindings.h" -#include "squirrelbindings/SquirrelFunctions.h" - #if USE_SQUIRREL + #include "squirrelbindings/SquirrelBindings.h" + #include "squirrelbindings/SquirrelFunctions.h" #pragma warning(disable:4100;disable:4127;disable:4510;disable:4610;disable:4244;disable:4512) // Getting A LOT of these warnings from SqPlus #pragma warning(default:4100;default:4127;default:4510;default:4610;default:4244;default:4512) @@ -39,7 +40,9 @@ cPluginManager* cPluginManager::GetPluginManager() cPluginManager::cPluginManager() : m_LuaCommandBinder( new cLuaCommandBinder() ) +#if USE_SQUIRREL , m_SquirrelCommandBinder( new cSquirrelCommandBinder() ) +#endif , m_bReloadPlugins(false) { } @@ -53,7 +56,9 @@ cPluginManager::~cPluginManager() UnloadPluginsNow(); delete m_LuaCommandBinder; +#if USE_SQUIRREL delete m_SquirrelCommandBinder; +#endif } @@ -197,10 +202,12 @@ bool cPluginManager::CallHook(PluginHook a_Hook, unsigned int a_NumArgs, ...) cPlayer * Player = va_arg(argptr, cPlayer * ); va_end (argptr); +#if USE_SQUIRREL if (m_SquirrelCommandBinder->HandleCommand( std::string( Message ), Player)) { return true; } +#endif if (m_LuaCommandBinder->HandleCommand( std::string( Message ), Player)) { @@ -682,7 +689,9 @@ void cPluginManager::RemovePlugin( cPlugin* a_Plugin, bool a_bDelete /* = false if( a_bDelete ) { m_LuaCommandBinder->RemoveBindingsForPlugin( a_Plugin ); +#if USE_SQUIRREL m_SquirrelCommandBinder->RemoveBindingsForPlugin( a_Plugin ); +#endif m_Plugins.remove( a_Plugin ); RemoveHooks( a_Plugin ); a_Plugin->OnDisable(); diff --git a/source/cRoot.cpp b/source/cRoot.cpp index df89eb966..4d69635e2 100644 --- a/source/cRoot.cpp +++ b/source/cRoot.cpp @@ -16,8 +16,10 @@ #include "cRedstone.h" #include "blocks/Block.h" #include "items/Item.h" +#if USE_SQUIRREL #include "squirrelbindings/SquirrelFunctions.h" #include "squirrelbindings/SquirrelBindings.h" +#endif #include "cChunk.h" #include "../iniFile/iniFile.h" diff --git a/source/cSocket.cpp b/source/cSocket.cpp index 57ecfcbdc..edce83981 100644 --- a/source/cSocket.cpp +++ b/source/cSocket.cpp @@ -111,7 +111,7 @@ AString cSocket::GetErrorString( int a_ErrNo ) // According to http://linux.die.net/man/3/strerror_r there are two versions of strerror_r(): - #if ( _GNU_SOURCE ) // GNU version of strerror_r() + #if ( _GNU_SOURCE ) && !defined(ANDROID_NDK) // GNU version of strerror_r() char * res = strerror_r( errno, buffer, ARRAYCOUNT(buffer) ); if( res != NULL ) @@ -158,7 +158,7 @@ int cSocket::GetLastError() int cSocket::SetReuseAddress() { -#ifdef _WIN32 +#if defined(_WIN32) || defined(ANDROID_NDK) char yes = 1; #else int yes = 1; diff --git a/source/main.cpp b/source/main.cpp index 4b498ae0a..0fdaf2d50 100644 --- a/source/main.cpp +++ b/source/main.cpp @@ -6,13 +6,16 @@ #include //std::exception #include //std::signal #include //exit() +#ifdef USE_SQUIRREL #include "squirrelbindings/SquirrelFunctions.h" +#include "squirrelbindings/SquirrelBindings.h" +#endif #ifdef _WIN32 #include #endif // _WIN32 -#include "squirrelbindings/SquirrelBindings.h" + @@ -168,11 +171,14 @@ int main( int argc, char **argv ) // DEBUG: test the dumpfile creation: // *((int *)0) = 0; + #if !defined(ANDROID_NDK) try + #endif { cRoot Root; Root.Start(); } + #if !defined(ANDROID_NDK) catch( std::exception& e ) { LOGERROR("Standard exception: %s", e.what() ); @@ -181,6 +187,7 @@ int main( int argc, char **argv ) { LOGERROR("Unknown exception!"); } + #endif #if defined(_MSC_VER) && defined(_DEBUG) && defined(ENABLE_LEAK_FINDER) diff --git a/src/com/mcserver/MCServerActivity.java b/src/com/mcserver/MCServerActivity.java new file mode 100644 index 000000000..225ba7a94 --- /dev/null +++ b/src/com/mcserver/MCServerActivity.java @@ -0,0 +1,37 @@ +package com.mcserver; + +import android.app.Activity; +import android.os.Bundle; + +public class MCServerActivity extends Activity { + /** Called when the activity is first created. */ + @Override + public void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.main); + + MainThread p = new MainThread(); + p.start(); + + //NativeOnCreate(); + } + + + static { + System.loadLibrary("mcserver"); + } + + private static native void NativeOnCreate(); +} + + +class MainThread extends Thread { + MainThread() { + } + + public void run() { + NativeOnCreate(); + } + + private static native void NativeOnCreate(); +} \ No newline at end of file