1
0
Fork 0

Compiles on Android! Added Eclipse project, import it into your workspace and it should be runnable on Android!

Disabled Squirrel for Android
cLog now logs to Android LogCat as well
Fixed Lua so it compiles on Android
Removed/commented out exceptions in JsonCpp so it compiles on Android

git-svn-id: http://mc-server.googlecode.com/svn/trunk@741 0a769ca7-a7f5-676a-18bf-c427514a06d6
This commit is contained in:
faketruth 2012-08-15 21:24:11 +00:00
parent 5bc07ba743
commit d21e4dacf7
30 changed files with 399 additions and 21 deletions

8
.classpath Normal file
View File

@ -0,0 +1,8 @@
<?xml version="1.0" encoding="UTF-8"?>
<classpath>
<classpathentry kind="src" path="src"/>
<classpathentry kind="src" path="gen"/>
<classpathentry kind="con" path="com.android.ide.eclipse.adt.ANDROID_FRAMEWORK"/>
<classpathentry kind="con" path="com.android.ide.eclipse.adt.LIBRARIES"/>
<classpathentry kind="output" path="bin/classes"/>
</classpath>

33
.project Normal file
View File

@ -0,0 +1,33 @@
<?xml version="1.0" encoding="UTF-8"?>
<projectDescription>
<name>MCServer</name>
<comment></comment>
<projects>
</projects>
<buildSpec>
<buildCommand>
<name>com.android.ide.eclipse.adt.ResourceManagerBuilder</name>
<arguments>
</arguments>
</buildCommand>
<buildCommand>
<name>com.android.ide.eclipse.adt.PreCompilerBuilder</name>
<arguments>
</arguments>
</buildCommand>
<buildCommand>
<name>org.eclipse.jdt.core.javabuilder</name>
<arguments>
</arguments>
</buildCommand>
<buildCommand>
<name>com.android.ide.eclipse.adt.ApkBuilder</name>
<arguments>
</arguments>
</buildCommand>
</buildSpec>
<natures>
<nature>com.android.ide.eclipse.adt.AndroidNature</nature>
<nature>org.eclipse.jdt.core.javanature</nature>
</natures>
</projectDescription>

View File

@ -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

25
AndroidManifest.xml Normal file
View File

@ -0,0 +1,25 @@
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.mcserver"
android:versionCode="1"
android:versionName="1.0" >
<uses-permission android:name="android.permission.INTERNET"></uses-permission>
<uses-sdk android:minSdkVersion="10" />
<application
android:icon="@drawable/ic_launcher"
android:label="@string/app_name" >
<activity
android:name=".MCServerActivity"
android:label="@string/app_name" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>

View File

@ -98,7 +98,9 @@ Socket::Socket() :
if (!IsValid()) if (!IsValid())
{ {
#if !defined(ANDROID_NDK)
throw "INVALID_SOCKET"; throw "INVALID_SOCKET";
#endif
} }
refCounter_ = new int(1); 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 (select(Highest + 1, &fds_, NULL, NULL, NULL) == SOCKET_ERROR)
{ {
#if !defined(ANDROID_NDK)
throw "Error in select"; throw "Error in select";
#endif
} }
} }

View File

@ -3,6 +3,9 @@
#include "base64.h" #include "base64.h"
#include <iostream> #include <iostream>
#if defined(ANDROID_NDK)
#include <ctype.h>
#endif
static const std::string base64_chars = static const std::string base64_chars =
"ABCDEFGHIJKLMNOPQRSTUVWXYZ" "ABCDEFGHIJKLMNOPQRSTUVWXYZ"

View File

@ -0,0 +1,6 @@
/** Automatically generated file. DO NOT MODIFY */
package com.mcserver;
public final class BuildConfig {
public final static boolean DEBUG = true;
}

23
gen/com/mcserver/R.java Normal file
View File

@ -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;
}
}

44
jni/Android.mk Normal file
View File

@ -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)

4
jni/Application.mk Normal file
View File

@ -0,0 +1,4 @@
# Build both ARMv5TE and ARMv7-A machine code.
APP_MODULES := mcserver
# APP_ABI := armeabi armeabi-v7a
APP_STL := stlport_static

87
jni/app-android.cpp Normal file
View File

@ -0,0 +1,87 @@
#include "Globals.h"
#include <jni.h>
#include <sys/time.h>
#include <time.h>
#include <stdint.h>
#include <stdlib.h>
#include <math.h>
#include <float.h>
#include <assert.h>
#include "cCriticalSection.h"
#include "cRoot.h"
#include <android/log.h>
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();
}

View File

@ -871,13 +871,13 @@ Reader::getFormatedErrorMessages() const
return formattedMessage; return formattedMessage;
} }
#define JSON_ASSERT( condition ) assert( condition );
std::istream& operator>>( std::istream &sin, Value &root ) std::istream& operator>>( std::istream &sin, Value &root )
{ {
Json::Reader reader; Json::Reader reader;
bool ok = reader.parse(sin, root, true); bool ok = reader.parse(sin, root, true);
//JSON_ASSERT( ok ); JSON_ASSERT( ok );
if (!ok) throw std::runtime_error(reader.getFormatedErrorMessages()); //if (!ok) throw std::runtime_error(reader.getFormatedErrorMessages());
return sin; return sin;
} }

View File

@ -153,7 +153,8 @@ Value::CommentInfo::setComment( const char *text )
if ( comment_ ) if ( comment_ )
valueAllocator()->releaseStringValue( comment_ ); valueAllocator()->releaseStringValue( comment_ );
JSON_ASSERT( text ); 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. // It seems that /**/ style comments are acceptable as well.
comment_ = valueAllocator()->duplicateStringValue( text ); comment_ = valueAllocator()->duplicateStringValue( text );
} }
@ -697,7 +698,8 @@ Value::asString() const
case realValue: case realValue:
case arrayValue: case arrayValue:
case objectValue: 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: default:
JSON_ASSERT_UNREACHABLE; JSON_ASSERT_UNREACHABLE;
} }
@ -722,17 +724,20 @@ Value::asInt() const
case intValue: case intValue:
return value_.int_; return value_.int_;
case uintValue: 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_; return value_.uint_;
case realValue: 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_ ); return Int( value_.real_ );
case booleanValue: case booleanValue:
return value_.bool_ ? 1 : 0; return value_.bool_ ? 1 : 0;
case stringValue: case stringValue:
case arrayValue: case arrayValue:
case objectValue: 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: default:
JSON_ASSERT_UNREACHABLE; JSON_ASSERT_UNREACHABLE;
} }
@ -747,19 +752,22 @@ Value::asUInt() const
case nullValue: case nullValue:
return 0; return 0;
case intValue: 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_; return value_.int_;
case uintValue: case uintValue:
return value_.uint_; return value_.uint_;
case realValue: 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_ ); return UInt( value_.real_ );
case booleanValue: case booleanValue:
return value_.bool_ ? 1 : 0; return value_.bool_ ? 1 : 0;
case stringValue: case stringValue:
case arrayValue: case arrayValue:
case objectValue: 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: default:
JSON_ASSERT_UNREACHABLE; JSON_ASSERT_UNREACHABLE;
} }
@ -784,7 +792,8 @@ Value::asDouble() const
case stringValue: case stringValue:
case arrayValue: case arrayValue:
case objectValue: 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: default:
JSON_ASSERT_UNREACHABLE; JSON_ASSERT_UNREACHABLE;
} }

View File

@ -176,9 +176,13 @@ static void buffreplace (LexState *ls, char from, char to) {
static void trydecpoint (LexState *ls, SemInfo *seminfo) { static void trydecpoint (LexState *ls, SemInfo *seminfo) {
/* format error: try to update decimal point separator */ /* format error: try to update decimal point separator */
struct lconv *cv = localeconv();
char old = ls->decpoint; char old = ls->decpoint;
#if defined(ANDROID_NDK)
ls->decpoint = '.';
#else
struct lconv *cv = localeconv();
ls->decpoint = (cv ? cv->decimal_point[0] : '.'); ls->decpoint = (cv ? cv->decimal_point[0] : '.');
#endif
buffreplace(ls, old, ls->decpoint); /* try updated decimal separator */ buffreplace(ls, old, ls->decpoint); /* try updated decimal separator */
if (!luaO_str2d(luaZ_buffer(ls->buff), &seminfo->r)) { if (!luaO_str2d(luaZ_buffer(ls->buff), &seminfo->r)) {
/* format error with correct decimal point: no more options */ /* format error with correct decimal point: no more options */

20
proguard-project.txt Normal file
View File

@ -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 *;
#}

14
project.properties Normal file
View File

@ -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

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 14 KiB

12
res/layout/main.xml Normal file
View File

@ -0,0 +1,12 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical" >
<TextView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="@string/hello" />
</LinearLayout>

7
res/values/strings.xml Normal file
View File

@ -0,0 +1,7 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="hello">Hello World, MCServerActivity!</string>
<string name="app_name">MCServer</string>
</resources>

View File

@ -114,8 +114,14 @@ typedef short Int16;
#include <semaphore.h> #include <semaphore.h>
#include <errno.h> #include <errno.h>
#include <fcntl.h> #include <fcntl.h>
#if !defined(ANDROID_NDK)
#include <tr1/memory> #include <tr1/memory>
#endif #endif
#endif
#if !defined(ANDROID_NDK)
#define USE_SQUIRREL
#endif

View File

@ -5,6 +5,9 @@
#include "Globals.h" #include "Globals.h"
#if defined(ANDROID_NDK)
#include <ctype.h>
#endif

View File

@ -9,6 +9,9 @@
#include "cIsThread.h" #include "cIsThread.h"
#if defined(ANDROID_NDK)
#include <android/log.h>
#endif
@ -97,6 +100,10 @@ void cLog::ClearLog()
void cLog::Log(const char * a_Format, va_list argList) 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; AString Message;
AppendVPrintf(Message, a_Format, argList); AppendVPrintf(Message, a_Format, argList);

View File

@ -4,20 +4,21 @@
#include "cPlugin.h" #include "cPlugin.h"
#include "cPlugin_Lua.h" #include "cPlugin_Lua.h"
#include "cPlugin_NewLua.h" #include "cPlugin_NewLua.h"
#include "cPlugin_Squirrel.h"
#include "cWebAdmin.h" #include "cWebAdmin.h"
#include "cItem.h" #include "cItem.h"
#include "cRoot.h" #include "cRoot.h"
#include "cLuaCommandBinder.h" #include "cLuaCommandBinder.h"
#include "cSquirrelCommandBinder.h" #if USE_SQUIRREL
# include "cPlugin_Squirrel.h"
# include "cSquirrelCommandBinder.h"
#endif
#include "../iniFile/iniFile.h" #include "../iniFile/iniFile.h"
#include "tolua++.h" #include "tolua++.h"
#include "cPlayer.h" #include "cPlayer.h"
#include "squirrelbindings/SquirrelBindings.h"
#include "squirrelbindings/SquirrelFunctions.h"
#if USE_SQUIRREL #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(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) #pragma warning(default:4100;default:4127;default:4510;default:4610;default:4244;default:4512)
@ -39,7 +40,9 @@ cPluginManager* cPluginManager::GetPluginManager()
cPluginManager::cPluginManager() cPluginManager::cPluginManager()
: m_LuaCommandBinder( new cLuaCommandBinder() ) : m_LuaCommandBinder( new cLuaCommandBinder() )
#if USE_SQUIRREL
, m_SquirrelCommandBinder( new cSquirrelCommandBinder() ) , m_SquirrelCommandBinder( new cSquirrelCommandBinder() )
#endif
, m_bReloadPlugins(false) , m_bReloadPlugins(false)
{ {
} }
@ -53,7 +56,9 @@ cPluginManager::~cPluginManager()
UnloadPluginsNow(); UnloadPluginsNow();
delete m_LuaCommandBinder; delete m_LuaCommandBinder;
#if USE_SQUIRREL
delete m_SquirrelCommandBinder; delete m_SquirrelCommandBinder;
#endif
} }
@ -197,10 +202,12 @@ bool cPluginManager::CallHook(PluginHook a_Hook, unsigned int a_NumArgs, ...)
cPlayer * Player = va_arg(argptr, cPlayer * ); cPlayer * Player = va_arg(argptr, cPlayer * );
va_end (argptr); va_end (argptr);
#if USE_SQUIRREL
if (m_SquirrelCommandBinder->HandleCommand( std::string( Message ), Player)) if (m_SquirrelCommandBinder->HandleCommand( std::string( Message ), Player))
{ {
return true; return true;
} }
#endif
if (m_LuaCommandBinder->HandleCommand( std::string( Message ), Player)) 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 ) if( a_bDelete )
{ {
m_LuaCommandBinder->RemoveBindingsForPlugin( a_Plugin ); m_LuaCommandBinder->RemoveBindingsForPlugin( a_Plugin );
#if USE_SQUIRREL
m_SquirrelCommandBinder->RemoveBindingsForPlugin( a_Plugin ); m_SquirrelCommandBinder->RemoveBindingsForPlugin( a_Plugin );
#endif
m_Plugins.remove( a_Plugin ); m_Plugins.remove( a_Plugin );
RemoveHooks( a_Plugin ); RemoveHooks( a_Plugin );
a_Plugin->OnDisable(); a_Plugin->OnDisable();

View File

@ -16,8 +16,10 @@
#include "cRedstone.h" #include "cRedstone.h"
#include "blocks/Block.h" #include "blocks/Block.h"
#include "items/Item.h" #include "items/Item.h"
#if USE_SQUIRREL
#include "squirrelbindings/SquirrelFunctions.h" #include "squirrelbindings/SquirrelFunctions.h"
#include "squirrelbindings/SquirrelBindings.h" #include "squirrelbindings/SquirrelBindings.h"
#endif
#include "cChunk.h" #include "cChunk.h"
#include "../iniFile/iniFile.h" #include "../iniFile/iniFile.h"

View File

@ -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(): // 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) ); char * res = strerror_r( errno, buffer, ARRAYCOUNT(buffer) );
if( res != NULL ) if( res != NULL )
@ -158,7 +158,7 @@ int cSocket::GetLastError()
int cSocket::SetReuseAddress() int cSocket::SetReuseAddress()
{ {
#ifdef _WIN32 #if defined(_WIN32) || defined(ANDROID_NDK)
char yes = 1; char yes = 1;
#else #else
int yes = 1; int yes = 1;

View File

@ -6,13 +6,16 @@
#include <exception> //std::exception #include <exception> //std::exception
#include <csignal> //std::signal #include <csignal> //std::signal
#include <stdlib.h> //exit() #include <stdlib.h> //exit()
#ifdef USE_SQUIRREL
#include "squirrelbindings/SquirrelFunctions.h" #include "squirrelbindings/SquirrelFunctions.h"
#include "squirrelbindings/SquirrelBindings.h"
#endif
#ifdef _WIN32 #ifdef _WIN32
#include <dbghelp.h> #include <dbghelp.h>
#endif // _WIN32 #endif // _WIN32
#include "squirrelbindings/SquirrelBindings.h"
@ -168,11 +171,14 @@ int main( int argc, char **argv )
// DEBUG: test the dumpfile creation: // DEBUG: test the dumpfile creation:
// *((int *)0) = 0; // *((int *)0) = 0;
#if !defined(ANDROID_NDK)
try try
#endif
{ {
cRoot Root; cRoot Root;
Root.Start(); Root.Start();
} }
#if !defined(ANDROID_NDK)
catch( std::exception& e ) catch( std::exception& e )
{ {
LOGERROR("Standard exception: %s", e.what() ); LOGERROR("Standard exception: %s", e.what() );
@ -181,6 +187,7 @@ int main( int argc, char **argv )
{ {
LOGERROR("Unknown exception!"); LOGERROR("Unknown exception!");
} }
#endif
#if defined(_MSC_VER) && defined(_DEBUG) && defined(ENABLE_LEAK_FINDER) #if defined(_MSC_VER) && defined(_DEBUG) && defined(ENABLE_LEAK_FINDER)

View File

@ -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();
}