Use CMake's Android generators to crosscompile
This commit is contained in:
parent
c59ff9b431
commit
8c6d0b51c7
@ -1,8 +0,0 @@
|
|||||||
<?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>
|
|
@ -1,33 +0,0 @@
|
|||||||
<?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>
|
|
@ -1,4 +0,0 @@
|
|||||||
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
|
|
@ -1,27 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
|
||||||
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
|
|
||||||
package="com.mcserver"
|
|
||||||
android:versionCode="3"
|
|
||||||
android:versionName="r1375" >
|
|
||||||
|
|
||||||
<uses-permission android:name="android.permission.INTERNET" />
|
|
||||||
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
|
|
||||||
<uses-permission android:name="android.permission.READ_LOGS"/>
|
|
||||||
|
|
||||||
<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>
|
|
@ -1,2 +0,0 @@
|
|||||||
Put all pre-packaged plugins in here such as Core.
|
|
||||||
The user will be able to install each plugin in here separately.
|
|
@ -1,10 +0,0 @@
|
|||||||
Put all pre-packaged settings/preferences and license files in here.
|
|
||||||
Such as:
|
|
||||||
|
|
||||||
settings.example.ini
|
|
||||||
groups.example.ini
|
|
||||||
users.example.ini
|
|
||||||
webadmin.example.ini
|
|
||||||
Lua-LICENSE.txt
|
|
||||||
MersenneTwister-LICENSE.txt
|
|
||||||
etc.etc
|
|
@ -1 +0,0 @@
|
|||||||
Put pre-packaged webadmin template in here
|
|
@ -1,6 +0,0 @@
|
|||||||
/** Automatically generated file. DO NOT MODIFY */
|
|
||||||
package com.mcserver;
|
|
||||||
|
|
||||||
public final class BuildConfig {
|
|
||||||
public final static boolean DEBUG = true;
|
|
||||||
}
|
|
@ -1,39 +0,0 @@
|
|||||||
/* 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 id {
|
|
||||||
public static final int configure_server=0x7f050003;
|
|
||||||
public static final int ip_address=0x7f050005;
|
|
||||||
public static final int listView1=0x7f050006;
|
|
||||||
public static final int server_status_text=0x7f050004;
|
|
||||||
public static final int start_server=0x7f050002;
|
|
||||||
public static final int stop_server=0x7f050001;
|
|
||||||
public static final int textView2=0x7f050000;
|
|
||||||
}
|
|
||||||
public static final class layout {
|
|
||||||
public static final int list_item=0x7f030000;
|
|
||||||
public static final int main=0x7f030001;
|
|
||||||
}
|
|
||||||
public static final class string {
|
|
||||||
public static final int app_name=0x7f040001;
|
|
||||||
public static final int configure=0x7f040007;
|
|
||||||
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;
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,44 +0,0 @@
|
|||||||
LOCAL_PATH := $(call my-dir)
|
|
||||||
|
|
||||||
include $(CLEAR_VARS)
|
|
||||||
LOCAL_MODULE := mcserver
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
LOCAL_SRC_FILES := $(shell find ../lib/polarssl ../lib/lua ../lib/jsoncpp ../lib/zlib ../src ../lib/tolua++ ../lib/iniFile ../lib/expat ../lib/md5 ../lib/sqlite ../lib/luaexpat '(' -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 ToJava.cpp
|
|
||||||
|
|
||||||
LOCAL_CFLAGS := -DANDROID_NDK \
|
|
||||||
-O3 \
|
|
||||||
-funroll-loops \
|
|
||||||
-mfloat-abi=softfp -mfpu=neon \
|
|
||||||
-fexceptions \
|
|
||||||
|
|
||||||
|
|
||||||
LOCAL_STATIC_LIBRARIES := cpufeatures
|
|
||||||
|
|
||||||
LOCAL_C_INCLUDES := ../src \
|
|
||||||
../src/packets \
|
|
||||||
../src/items \
|
|
||||||
../src/blocks \
|
|
||||||
../lib/tolua++/src/lib \
|
|
||||||
../lib/lua/src \
|
|
||||||
../lib/zlib-1.2.7 \
|
|
||||||
../lib/iniFile \
|
|
||||||
../lib/tolua++/include \
|
|
||||||
../lib/jsoncpp/include \
|
|
||||||
../lib/jsoncpp/src/lib_json \
|
|
||||||
../lib/expat/ \
|
|
||||||
../lib/md5/ \
|
|
||||||
../lib/sqlite/ \
|
|
||||||
../lib/luaexpat/ \
|
|
||||||
.. \
|
|
||||||
|
|
||||||
|
|
||||||
LOCAL_LDLIBS := -ldl -llog
|
|
||||||
|
|
||||||
include $(BUILD_SHARED_LIBRARY)
|
|
||||||
$(call import-module,cpufeatures)
|
|
@ -1,7 +0,0 @@
|
|||||||
# Build both ARMv5TE and ARMv7-A machine code.
|
|
||||||
APP_MODULES := mcserver
|
|
||||||
# APP_ABI := armeabi armeabi-v7a
|
|
||||||
#APP_STL := stlport_static
|
|
||||||
|
|
||||||
APP_STL := gnustl_static
|
|
||||||
APP_CPPFLAGS := -frtti
|
|
@ -1,3 +0,0 @@
|
|||||||
#include "Globals.h"
|
|
||||||
|
|
||||||
#include "ToJava.h"
|
|
@ -1,59 +0,0 @@
|
|||||||
#pragma once
|
|
||||||
|
|
||||||
#include <jni.h>
|
|
||||||
#include <android/log.h>
|
|
||||||
extern JNIEnv* g_CurrentJNIEnv;
|
|
||||||
extern JavaVM* g_JavaVM;
|
|
||||||
extern jobject g_JavaThread;
|
|
||||||
//extern jobject g_JavaActivity;
|
|
||||||
|
|
||||||
//__android_log_vprint(ANDROID_LOG_ERROR,"MCServer", a_Format, argList);
|
|
||||||
|
|
||||||
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 );
|
|
||||||
jmethodID mid = g_CurrentJNIEnv->GetMethodID( cls, a_FunctionName.c_str(), "(Ljava/lang/String;)V"); // void a_FunctionName( 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, 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 );
|
|
||||||
jclass cls = g_CurrentJNIEnv->GetObjectClass( a_Object );
|
|
||||||
//__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 );
|
|
||||||
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 );
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
__android_log_print(ANDROID_LOG_ERROR,"MCServer", "It was 0, derp" );
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,130 +0,0 @@
|
|||||||
#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 "OSSupport/CriticalSection.h"
|
|
||||||
#include "OSSupport/File.h"
|
|
||||||
#include "ToJava.h"
|
|
||||||
|
|
||||||
#include "Root.h"
|
|
||||||
#include "WebAdmin.h"
|
|
||||||
|
|
||||||
#include <android/log.h>
|
|
||||||
|
|
||||||
#ifdef _WIN32 // For IntelliSense parsing
|
|
||||||
typedef void jobject;
|
|
||||||
typedef int jint;
|
|
||||||
typedef bool jboolean;
|
|
||||||
typedef void JavaVM;
|
|
||||||
typedef void JNIEnv;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
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_MCServerActivity_NativeOnCreate( JNIEnv* env, jobject thiz )
|
|
||||||
{
|
|
||||||
g_CriticalSection.Lock();
|
|
||||||
g_CurrentJNIEnv = env;
|
|
||||||
g_JavaThread = thiz;
|
|
||||||
//__android_log_print(ANDROID_LOG_ERROR,"MCServer", "%s", "Logging from C++!");
|
|
||||||
g_CriticalSection.Unlock();
|
|
||||||
|
|
||||||
cFile::CreateFolder("/sdcard/mcserver");
|
|
||||||
|
|
||||||
pRoot = new cRoot();
|
|
||||||
pRoot->Start();
|
|
||||||
delete pRoot; pRoot = NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
extern "C" void Java_com_mcserver_MCServerActivity_NativeCleanUp( JNIEnv* env, jobject thiz )
|
|
||||||
{
|
|
||||||
g_CriticalSection.Lock();
|
|
||||||
g_CurrentJNIEnv = env;
|
|
||||||
g_JavaThread = thiz;
|
|
||||||
g_CriticalSection.Unlock();
|
|
||||||
|
|
||||||
__android_log_print(ANDROID_LOG_ERROR,"MCServer", "pRoot: %p", pRoot);
|
|
||||||
if( pRoot != NULL )
|
|
||||||
{
|
|
||||||
pRoot->QueueExecuteConsoleCommand("stop");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
extern "C" jboolean Java_com_mcserver_MCServerActivity_NativeIsServerRunning( JNIEnv* env, jobject thiz )
|
|
||||||
{
|
|
||||||
return pRoot != NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
extern "C" jint Java_com_mcserver_MCServerActivity_NativeGetWebAdminPort( JNIEnv* env, jobject thiz )
|
|
||||||
{
|
|
||||||
if( pRoot != NULL && pRoot->GetWebAdmin() != NULL )
|
|
||||||
{
|
|
||||||
return atoi(pRoot->GetWebAdmin()->GetIPv4Ports().c_str());
|
|
||||||
}
|
|
||||||
return 0;
|
|
||||||
}
|
|
@ -1,20 +0,0 @@
|
|||||||
# 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 *;
|
|
||||||
#}
|
|
@ -1,14 +0,0 @@
|
|||||||
# 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.
Before Width: | Height: | Size: 13 KiB |
Binary file not shown.
Before Width: | Height: | Size: 5.8 KiB |
Binary file not shown.
Before Width: | Height: | Size: 7.8 KiB |
Binary file not shown.
Before Width: | Height: | Size: 18 KiB |
@ -1,7 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
|
||||||
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
|
|
||||||
android:layout_width="match_parent"
|
|
||||||
android:layout_height="match_parent" >
|
|
||||||
|
|
||||||
|
|
||||||
</TextView>
|
|
@ -1,61 +0,0 @@
|
|||||||
<?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:gravity="center_horizontal"
|
|
||||||
android:orientation="vertical" >
|
|
||||||
|
|
||||||
<TextView
|
|
||||||
android:id="@+id/textView2"
|
|
||||||
android:layout_width="wrap_content"
|
|
||||||
android:layout_height="wrap_content"
|
|
||||||
android:text="@string/app_name"
|
|
||||||
android:textAppearance="?android:attr/textAppearanceLarge" />
|
|
||||||
|
|
||||||
<LinearLayout
|
|
||||||
android:layout_width="match_parent"
|
|
||||||
android:layout_height="wrap_content" >
|
|
||||||
|
|
||||||
<Button
|
|
||||||
android:id="@+id/stop_server"
|
|
||||||
android:layout_width="wrap_content"
|
|
||||||
android:layout_height="wrap_content"
|
|
||||||
android:layout_weight="1"
|
|
||||||
android:enabled="true"
|
|
||||||
android:text="@string/stop" />
|
|
||||||
|
|
||||||
<Button
|
|
||||||
android:id="@+id/start_server"
|
|
||||||
android:layout_width="wrap_content"
|
|
||||||
android:layout_height="wrap_content"
|
|
||||||
android:layout_weight="1"
|
|
||||||
android:text="@string/start" />
|
|
||||||
|
|
||||||
<Button
|
|
||||||
android:id="@+id/configure_server"
|
|
||||||
android:layout_width="wrap_content"
|
|
||||||
android:layout_height="wrap_content"
|
|
||||||
android:layout_weight="1"
|
|
||||||
android:text="@string/configure" />
|
|
||||||
|
|
||||||
</LinearLayout>
|
|
||||||
|
|
||||||
<TextView
|
|
||||||
android:id="@+id/server_status_text"
|
|
||||||
android:layout_width="wrap_content"
|
|
||||||
android:layout_height="wrap_content"
|
|
||||||
android:text="@string/mcserver_is_not_running"
|
|
||||||
android:textAppearance="?android:attr/textAppearanceMedium" />
|
|
||||||
|
|
||||||
<TextView
|
|
||||||
android:id="@+id/ip_address"
|
|
||||||
android:layout_width="wrap_content"
|
|
||||||
android:layout_height="wrap_content"
|
|
||||||
android:text="@string/your_ip" />
|
|
||||||
<ListView
|
|
||||||
android:id="@+id/listView1"
|
|
||||||
android:layout_width="match_parent"
|
|
||||||
android:layout_height="wrap_content" >
|
|
||||||
</ListView>
|
|
||||||
|
|
||||||
</LinearLayout>
|
|
@ -1,13 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
|
||||||
<resources>
|
|
||||||
|
|
||||||
<string name="hello">Hello World, MCServerActivity!</string>
|
|
||||||
<string name="app_name">MCServer</string>
|
|
||||||
<string name="start">Start</string>
|
|
||||||
<string name="stop">Stop</string>
|
|
||||||
<string name="mcserver_is_running">MCServer jest włączony</string>
|
|
||||||
<string name="mcserver_is_not_running">MCServer jest wyłączony</string>
|
|
||||||
<string name="your_ip">Twoje IP …</string>
|
|
||||||
<string name="configure">Ustawienia</string>
|
|
||||||
|
|
||||||
</resources>
|
|
@ -1,13 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
|
||||||
<resources>
|
|
||||||
|
|
||||||
<string name="hello">Hello World, MCServerActivity!</string>
|
|
||||||
<string name="app_name">MCServer</string>
|
|
||||||
<string name="start">Start</string>
|
|
||||||
<string name="stop">Stop</string>
|
|
||||||
<string name="mcserver_is_running">MCServer is running</string>
|
|
||||||
<string name="mcserver_is_not_running">MCServer is not running</string>
|
|
||||||
<string name="your_ip">Your IP …</string>
|
|
||||||
<string name="configure">Configure</string>
|
|
||||||
|
|
||||||
</resources>
|
|
@ -1,302 +0,0 @@
|
|||||||
package com.mcserver;
|
|
||||||
|
|
||||||
import java.io.BufferedReader;
|
|
||||||
import java.io.IOException;
|
|
||||||
import java.io.InputStreamReader;
|
|
||||||
import java.net.InetAddress;
|
|
||||||
import java.net.NetworkInterface;
|
|
||||||
import java.net.SocketException;
|
|
||||||
import java.util.ArrayList;
|
|
||||||
import java.util.Enumeration;
|
|
||||||
|
|
||||||
import android.app.Activity;
|
|
||||||
import android.content.Intent;
|
|
||||||
import android.graphics.Color;
|
|
||||||
import android.net.Uri;
|
|
||||||
import android.os.Bundle;
|
|
||||||
import android.util.Log;
|
|
||||||
import android.view.KeyEvent;
|
|
||||||
import android.view.Menu;
|
|
||||||
import android.view.MenuItem;
|
|
||||||
import android.view.View;
|
|
||||||
import android.widget.ArrayAdapter;
|
|
||||||
import android.widget.Button;
|
|
||||||
import android.widget.ListView;
|
|
||||||
import android.widget.TextView;
|
|
||||||
|
|
||||||
public class MCServerActivity extends Activity {
|
|
||||||
MainThread mThread = null;
|
|
||||||
Thread ServerStatusThread = null;
|
|
||||||
boolean mbExiting = false;
|
|
||||||
boolean mbEnabledLogging = false;
|
|
||||||
|
|
||||||
ArrayList<String> mLogList = new ArrayList<String>();
|
|
||||||
ArrayAdapter<String> mAdapter;
|
|
||||||
|
|
||||||
MCServerInstaller mInstaller = null;
|
|
||||||
|
|
||||||
final private int MENU_REINSTALL = 0;
|
|
||||||
|
|
||||||
/** Called when the activity is first created. */
|
|
||||||
@Override
|
|
||||||
public void onCreate(Bundle savedInstanceState) {
|
|
||||||
super.onCreate(savedInstanceState);
|
|
||||||
setContentView(R.layout.main);
|
|
||||||
|
|
||||||
//Log.e("MCServer", "p id: " + android.os.Process.myPid() );
|
|
||||||
|
|
||||||
|
|
||||||
((Button)findViewById(R.id.start_server)).setOnClickListener( new View.OnClickListener() {
|
|
||||||
public void onClick(View v) {
|
|
||||||
mbEnabledLogging = true;
|
|
||||||
if( mThread == null || mThread.isAlive() == false ) {
|
|
||||||
mThread = new MainThread( (MCServerActivity)v.getContext() );
|
|
||||||
mThread.start();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
((Button)findViewById(R.id.stop_server)).setOnClickListener( new View.OnClickListener() {
|
|
||||||
public void onClick(View v) {
|
|
||||||
mbEnabledLogging = true;
|
|
||||||
NativeCleanUp();
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
((Button)findViewById(R.id.configure_server)).setOnClickListener( new View.OnClickListener() {
|
|
||||||
public void onClick(View v) {
|
|
||||||
Intent myIntent = new Intent(Intent.ACTION_VIEW, Uri.parse("http://localhost:" + NativeGetWebAdminPort() + "/webadmin/"));
|
|
||||||
startActivity( myIntent );
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
ListView lv = (ListView)this.findViewById(R.id.listView1);
|
|
||||||
mAdapter = new ArrayAdapter<String>(this,
|
|
||||||
R.layout.list_item,
|
|
||||||
mLogList);
|
|
||||||
lv.setAdapter(mAdapter);
|
|
||||||
|
|
||||||
|
|
||||||
mLogList.add("---- LOG ----");
|
|
||||||
|
|
||||||
ServerStatusThread = new Thread( new Runnable() {
|
|
||||||
public void run() {
|
|
||||||
for(;;)
|
|
||||||
{
|
|
||||||
try {
|
|
||||||
runOnUiThread( new Runnable() {
|
|
||||||
public void run() {
|
|
||||||
UpdateServerStatus();
|
|
||||||
}
|
|
||||||
});
|
|
||||||
Thread.sleep(1000);
|
|
||||||
} catch (InterruptedException e) {
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
});
|
|
||||||
ServerStatusThread.start();
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
Thread loggerThread = new Thread( new Runnable() {
|
|
||||||
public void run() {
|
|
||||||
Process process = null;
|
|
||||||
|
|
||||||
try {
|
|
||||||
process = Runtime.getRuntime().exec("logcat -v raw *:s MCServer ");// Verbose filter
|
|
||||||
} catch (IOException e) {
|
|
||||||
}
|
|
||||||
|
|
||||||
BufferedReader reader = null;
|
|
||||||
|
|
||||||
try {
|
|
||||||
InputStreamReader isr = new InputStreamReader(process.getInputStream());
|
|
||||||
reader = new BufferedReader( isr );
|
|
||||||
|
|
||||||
String line;
|
|
||||||
|
|
||||||
while( mbExiting == false ) {
|
|
||||||
line = reader.readLine();
|
|
||||||
if( mbEnabledLogging == true && line != null )
|
|
||||||
{
|
|
||||||
AddToLog( line );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
Log.i("MCServer", "Prepping thread for termination");
|
|
||||||
reader.close();
|
|
||||||
process.destroy();
|
|
||||||
process = null;
|
|
||||||
reader = null;
|
|
||||||
} catch (IOException e) {
|
|
||||||
}
|
|
||||||
}
|
|
||||||
});
|
|
||||||
loggerThread.start();
|
|
||||||
|
|
||||||
((TextView)findViewById(R.id.ip_address)).setText("Connect to: " + getLocalIpAddress());
|
|
||||||
|
|
||||||
|
|
||||||
mInstaller = new MCServerInstaller(this);
|
|
||||||
if( mInstaller.NeedsUpdate() )
|
|
||||||
{
|
|
||||||
mInstaller.ShowFirstRunDialog();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
public String getLocalIpAddress() {
|
|
||||||
try {
|
|
||||||
for (Enumeration<NetworkInterface> en = NetworkInterface.getNetworkInterfaces(); en.hasMoreElements();) {
|
|
||||||
NetworkInterface intf = en.nextElement();
|
|
||||||
for (Enumeration<InetAddress> enumIpAddr = intf.getInetAddresses(); enumIpAddr.hasMoreElements();) {
|
|
||||||
InetAddress inetAddress = enumIpAddr.nextElement();
|
|
||||||
if (!inetAddress.isLoopbackAddress()) {
|
|
||||||
return inetAddress.getHostAddress().toString();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} catch (SocketException ex) {
|
|
||||||
Log.e("MCServer", ex.toString());
|
|
||||||
}
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
public void UpdateServerStatus()
|
|
||||||
{
|
|
||||||
if( NativeIsServerRunning() ) {
|
|
||||||
((TextView)findViewById(R.id.server_status_text)).setText(R.string.mcserver_is_running);
|
|
||||||
((TextView)findViewById(R.id.server_status_text)).setTextColor(Color.GREEN);
|
|
||||||
((Button)findViewById(R.id.stop_server)).setEnabled(true);
|
|
||||||
((Button)findViewById(R.id.start_server)).setEnabled(false);
|
|
||||||
((Button)findViewById(R.id.configure_server)).setEnabled(true);
|
|
||||||
} else {
|
|
||||||
((TextView)findViewById(R.id.server_status_text)).setText(R.string.mcserver_is_not_running);
|
|
||||||
((TextView)findViewById(R.id.server_status_text)).setTextColor(Color.RED);
|
|
||||||
((Button)findViewById(R.id.stop_server)).setEnabled(false);
|
|
||||||
((Button)findViewById(R.id.start_server)).setEnabled(true);
|
|
||||||
((Button)findViewById(R.id.configure_server)).setEnabled(false);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
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;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
public void onDestroy() {
|
|
||||||
mbExiting = true;
|
|
||||||
super.onDestroy();
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
public void AddToLog( final String logMessage ) {
|
|
||||||
final ListView lv = ((ListView)findViewById(R.id.listView1));
|
|
||||||
lv.post(new Runnable() {
|
|
||||||
public void run() {
|
|
||||||
//final boolean bAutoscroll = lv.getLastVisiblePosition() >= mAdapter.getCount() - 1 ? true : false;
|
|
||||||
|
|
||||||
mLogList.add(logMessage);
|
|
||||||
while( mLogList.size() > 100 ) // only allow 100 messages in the list, otherwise it might slow the GUI down
|
|
||||||
{
|
|
||||||
mLogList.remove(0);
|
|
||||||
}
|
|
||||||
mAdapter.notifyDataSetChanged();
|
|
||||||
|
|
||||||
|
|
||||||
// Autoscroll detection is dodgy
|
|
||||||
//if( bAutoscroll )
|
|
||||||
{
|
|
||||||
lv.setSelection(mAdapter.getCount() - 1);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean onCreateOptionsMenu(Menu menu) {
|
|
||||||
menu.add(0, MENU_REINSTALL, 0, "Reinstall MCServer" );
|
|
||||||
return super.onCreateOptionsMenu(menu);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean onOptionsItemSelected(MenuItem item) {
|
|
||||||
|
|
||||||
switch( item.getItemId() )
|
|
||||||
{
|
|
||||||
case MENU_REINSTALL:
|
|
||||||
mInstaller.ShowPluginInstallDialog(true);
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
static {
|
|
||||||
System.loadLibrary("mcserver");
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
public native void NativeOnCreate();
|
|
||||||
public native void NativeCleanUp();
|
|
||||||
public native boolean NativeIsServerRunning();
|
|
||||||
public native int NativeGetWebAdminPort();
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
class MainThread extends Thread {
|
|
||||||
MCServerActivity mContext = null;
|
|
||||||
int numlogs = 0;
|
|
||||||
|
|
||||||
MainThread( MCServerActivity aContext ) {
|
|
||||||
mContext = aContext;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void run() {
|
|
||||||
mContext.NativeOnCreate();
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -1,432 +0,0 @@
|
|||||||
package com.mcserver;
|
|
||||||
|
|
||||||
import java.io.File;
|
|
||||||
import java.io.FileOutputStream;
|
|
||||||
import java.io.IOException;
|
|
||||||
import java.io.InputStream;
|
|
||||||
import java.io.OutputStream;
|
|
||||||
import java.util.ArrayList;
|
|
||||||
|
|
||||||
import android.app.AlertDialog;
|
|
||||||
import android.app.ProgressDialog;
|
|
||||||
import android.content.DialogInterface;
|
|
||||||
import android.content.SharedPreferences;
|
|
||||||
import android.content.pm.PackageManager.NameNotFoundException;
|
|
||||||
import android.content.res.AssetManager;
|
|
||||||
import android.os.AsyncTask;
|
|
||||||
import android.os.Environment;
|
|
||||||
import android.util.Log;
|
|
||||||
|
|
||||||
public class MCServerInstaller {
|
|
||||||
private MCServerActivity mContext;
|
|
||||||
final private String BaseDirectory = "basedir";
|
|
||||||
final private String PluginDirectory = "Plugins";
|
|
||||||
|
|
||||||
final public String SHARED_PREFS_NAME = "MCSERVER_PREFS";
|
|
||||||
final public String PREF_IS_INSTALLED = "IS_INSTALLED";
|
|
||||||
final public String PREF_LAST_VERSION = "LAST_VERSION";
|
|
||||||
private SharedPreferences mSettings = null;
|
|
||||||
|
|
||||||
int thisVersion;
|
|
||||||
|
|
||||||
MCServerInstaller( MCServerActivity activity )
|
|
||||||
{
|
|
||||||
mContext = activity;
|
|
||||||
|
|
||||||
mSettings = mContext.getSharedPreferences( SHARED_PREFS_NAME, 0);
|
|
||||||
|
|
||||||
try {
|
|
||||||
this.thisVersion = mContext.getPackageManager().getPackageInfo(mContext.getPackageName(), 0).versionCode;
|
|
||||||
} catch (NameNotFoundException e) {
|
|
||||||
Log.e("MCServer", "Could not read version code from manifest!");
|
|
||||||
e.printStackTrace();
|
|
||||||
this.thisVersion = -1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
public boolean IsInstalled()
|
|
||||||
{
|
|
||||||
return mSettings.getBoolean(PREF_IS_INSTALLED, false);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
public boolean NeedsUpdate()
|
|
||||||
{
|
|
||||||
Log.i("MCServer", "thisVersion: " + this.thisVersion + " pref: " + mSettings.getInt(PREF_LAST_VERSION, 0));
|
|
||||||
return mSettings.getInt(PREF_LAST_VERSION, 0) != this.thisVersion;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
public ArrayList<String> FindFoldersInPath(String path)
|
|
||||||
{
|
|
||||||
ArrayList<String> allFolders = new ArrayList<String>();
|
|
||||||
AssetManager am = mContext.getAssets();
|
|
||||||
try {
|
|
||||||
String[] allPlugins = am.list(path);
|
|
||||||
for(String pluginName : allPlugins)
|
|
||||||
{
|
|
||||||
InputStream istr = null;
|
|
||||||
try
|
|
||||||
{
|
|
||||||
istr = am.open(path + "/" + pluginName);
|
|
||||||
} catch( java.io.FileNotFoundException e ) {
|
|
||||||
// It seems to be a folder :D
|
|
||||||
allFolders.add(pluginName);
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
istr.close();
|
|
||||||
}
|
|
||||||
} catch (IOException e) {
|
|
||||||
e.printStackTrace();
|
|
||||||
}
|
|
||||||
|
|
||||||
return allFolders;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
public void ExpandAssets( String path )
|
|
||||||
{
|
|
||||||
AssetManager am = mContext.getAssets();
|
|
||||||
try {
|
|
||||||
String[] getAssets = am.list(path);
|
|
||||||
for(String assetName : getAssets)
|
|
||||||
{
|
|
||||||
//Log.e("MCServer", path + "/" + imgName);
|
|
||||||
|
|
||||||
InputStream istr = null;
|
|
||||||
try
|
|
||||||
{
|
|
||||||
istr = am.open(path + "/" + assetName);
|
|
||||||
} catch( java.io.FileNotFoundException e ) {
|
|
||||||
//Log.e("MCServer", "Could not open" + path + "/" + imgName );
|
|
||||||
ExpandAssets(path + "/" + assetName);
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
String outPath = Environment.getExternalStorageDirectory().getPath() + "/mcserver/" + path + "/" + assetName;
|
|
||||||
//Log.e("MCServer", "outPath: " + outPath );
|
|
||||||
File f = new File( outPath );
|
|
||||||
|
|
||||||
f.getParentFile().mkdirs();
|
|
||||||
f.createNewFile();
|
|
||||||
OutputStream ostr = new FileOutputStream(f);
|
|
||||||
|
|
||||||
byte[] buffer = new byte[1024];
|
|
||||||
int length;
|
|
||||||
while ((length = istr.read(buffer))>0)
|
|
||||||
{
|
|
||||||
ostr.write(buffer, 0, length);
|
|
||||||
}
|
|
||||||
ostr.flush();
|
|
||||||
ostr.close();
|
|
||||||
istr.close();
|
|
||||||
}
|
|
||||||
} catch (IOException e) {
|
|
||||||
e.printStackTrace();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void ShowFirstRunDialog()
|
|
||||||
{
|
|
||||||
AlertDialog.Builder builder = new AlertDialog.Builder(mContext);
|
|
||||||
//builder.setTitle("blaa");
|
|
||||||
builder.setPositiveButton(android.R.string.ok, new DialogInterface.OnClickListener() {
|
|
||||||
public void onClick(DialogInterface dialog, int which) {
|
|
||||||
dialog.dismiss();
|
|
||||||
}
|
|
||||||
});
|
|
||||||
builder.setMessage("It seems this is the first time you are running MCServer on your Android device or it has been updated! This app comes with a couple of pre-packaged plugins, please take a moment to select the plugins you would like to install.");
|
|
||||||
builder.setCancelable(false);
|
|
||||||
AlertDialog dialog = builder.create();
|
|
||||||
dialog.show();
|
|
||||||
|
|
||||||
dialog.setOnDismissListener( new DialogInterface.OnDismissListener(){
|
|
||||||
public void onDismiss(DialogInterface dialog) {
|
|
||||||
ShowPluginInstallDialog(false);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
public void ShowPluginInstallDialog(boolean bCancelable)
|
|
||||||
{
|
|
||||||
final ArrayList<String> allPlugins = FindFoldersInPath( BaseDirectory + "/" + PluginDirectory );
|
|
||||||
final CharSequence[] items = allPlugins.toArray(new CharSequence[allPlugins.size()]);
|
|
||||||
final boolean[] selected = new boolean[items.length];
|
|
||||||
for( int i = 0; i < items.length; ++i )
|
|
||||||
{
|
|
||||||
if( items[i].toString().contains("Core") )
|
|
||||||
{ // Select the core plugin by default
|
|
||||||
selected[i] = true;
|
|
||||||
items[i] = items[i] + " (Recommended)";
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
AlertDialog.Builder builder = new AlertDialog.Builder(mContext);
|
|
||||||
builder.setTitle("Plugins to install");
|
|
||||||
builder.setCancelable(bCancelable);
|
|
||||||
builder.setMultiChoiceItems(items, selected, new DialogInterface.OnMultiChoiceClickListener() {
|
|
||||||
public void onClick(DialogInterface dialog, int which, boolean isChecked) {
|
|
||||||
selected[which] = isChecked;
|
|
||||||
}
|
|
||||||
});
|
|
||||||
builder.setPositiveButton("Install", new DialogInterface.OnClickListener() {
|
|
||||||
public void onClick(DialogInterface dialog, int which) {
|
|
||||||
ArrayList<String> toInstall = new ArrayList<String>();
|
|
||||||
for( int i = 0; i < selected.length; ++i )
|
|
||||||
{
|
|
||||||
if( selected[i] )
|
|
||||||
{
|
|
||||||
toInstall.add(allPlugins.get(i));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
InstallPlugins(toInstall);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
AlertDialog dialog2 = builder.create();
|
|
||||||
dialog2.show();
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void InstallPlugins( final ArrayList<String> plugins )
|
|
||||||
{
|
|
||||||
new AsyncTask<Void, Integer, Boolean>()
|
|
||||||
{
|
|
||||||
ProgressDialog progressDialog;
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected void onPreExecute()
|
|
||||||
{
|
|
||||||
/*
|
|
||||||
* This is executed on UI thread before doInBackground(). It is
|
|
||||||
* the perfect place to show the progress dialog.
|
|
||||||
*/
|
|
||||||
progressDialog = ProgressDialog.show(mContext, "", "Installing...");
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected Boolean doInBackground(Void... params)
|
|
||||||
{
|
|
||||||
if (params == null)
|
|
||||||
{
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
try
|
|
||||||
{
|
|
||||||
/*
|
|
||||||
* This is run on a background thread, so we can sleep here
|
|
||||||
* or do whatever we want without blocking UI thread. A more
|
|
||||||
* advanced use would download chunks of fixed size and call
|
|
||||||
* publishProgress();
|
|
||||||
*/
|
|
||||||
for( int i = 0; i < plugins.size(); ++i )
|
|
||||||
{
|
|
||||||
this.publishProgress((int)(i / (float)plugins.size() * 100), i);
|
|
||||||
InstallSinglePlugin(PluginDirectory + "/" + plugins.get(i));
|
|
||||||
}
|
|
||||||
|
|
||||||
this.publishProgress( 100, -1 );
|
|
||||||
InstallExampleSettings();
|
|
||||||
|
|
||||||
this.publishProgress( 100, -2 );
|
|
||||||
InstallWebAdmin();
|
|
||||||
|
|
||||||
}
|
|
||||||
catch (Exception e)
|
|
||||||
{
|
|
||||||
Log.e("tag", e.getMessage());
|
|
||||||
/*
|
|
||||||
* The task failed
|
|
||||||
*/
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* The task succeeded
|
|
||||||
*/
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
protected void onProgressUpdate(Integer... progress)
|
|
||||||
{
|
|
||||||
progressDialog.setProgress(progress[0]);
|
|
||||||
if( progress[1] > -1 )
|
|
||||||
{
|
|
||||||
progressDialog.setMessage("Installing " + plugins.get(progress[1]) + "..." );
|
|
||||||
}
|
|
||||||
else if( progress[1] == -1 )
|
|
||||||
{
|
|
||||||
progressDialog.setMessage("Installing default settings...");
|
|
||||||
}
|
|
||||||
else if( progress[1] == -2 )
|
|
||||||
{
|
|
||||||
progressDialog.setMessage("Installing WebAdmin...");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected void onPostExecute(Boolean result)
|
|
||||||
{
|
|
||||||
progressDialog.dismiss();
|
|
||||||
/*
|
|
||||||
* Update here your view objects with content from download. It
|
|
||||||
* is save to dismiss dialogs, update views, etc., since we are
|
|
||||||
* working on UI thread.
|
|
||||||
*/
|
|
||||||
AlertDialog.Builder b = new AlertDialog.Builder(mContext);
|
|
||||||
b.setTitle(android.R.string.dialog_alert_title);
|
|
||||||
if (result)
|
|
||||||
{
|
|
||||||
b.setMessage("Install succeeded");
|
|
||||||
|
|
||||||
SharedPreferences.Editor editor = mSettings.edit();
|
|
||||||
editor.putBoolean(PREF_IS_INSTALLED, true);
|
|
||||||
editor.putInt(PREF_LAST_VERSION, thisVersion);
|
|
||||||
editor.commit();
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
b.setMessage("Install failed");
|
|
||||||
}
|
|
||||||
b.setPositiveButton(android.R.string.ok,
|
|
||||||
new DialogInterface.OnClickListener()
|
|
||||||
{
|
|
||||||
public void onClick(DialogInterface dialog, int which)
|
|
||||||
{
|
|
||||||
dialog.dismiss();
|
|
||||||
}
|
|
||||||
});
|
|
||||||
b.create().show();
|
|
||||||
}
|
|
||||||
}.execute();
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void InstallExampleSettings()
|
|
||||||
{
|
|
||||||
AssetManager am = mContext.getAssets();
|
|
||||||
try {
|
|
||||||
String[] allFiles = am.list(BaseDirectory);
|
|
||||||
for(String fileName : allFiles)
|
|
||||||
{
|
|
||||||
InputStream istr = null;
|
|
||||||
try
|
|
||||||
{
|
|
||||||
istr = am.open(BaseDirectory + "/" + fileName);
|
|
||||||
} catch( java.io.FileNotFoundException e ) {
|
|
||||||
// Must be a folder :D
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
String outPath = Environment.getExternalStorageDirectory().getPath() + "/mcserver/" + fileName;
|
|
||||||
Log.i("MCServer", "outPath: " + outPath );
|
|
||||||
File f = new File( outPath );
|
|
||||||
|
|
||||||
f.getParentFile().mkdirs();
|
|
||||||
f.createNewFile();
|
|
||||||
OutputStream ostr = new FileOutputStream(f);
|
|
||||||
|
|
||||||
byte[] buffer = new byte[1024];
|
|
||||||
int length;
|
|
||||||
while ((length = istr.read(buffer))>0)
|
|
||||||
{
|
|
||||||
ostr.write(buffer, 0, length);
|
|
||||||
}
|
|
||||||
ostr.flush();
|
|
||||||
ostr.close();
|
|
||||||
istr.close();
|
|
||||||
}
|
|
||||||
} catch (IOException e) {
|
|
||||||
e.printStackTrace();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void InstallWebAdmin()
|
|
||||||
{
|
|
||||||
AssetManager am = mContext.getAssets();
|
|
||||||
try {
|
|
||||||
String[] allFiles = am.list(BaseDirectory + "/webadmin");
|
|
||||||
for(String fileName : allFiles)
|
|
||||||
{
|
|
||||||
InputStream istr = null;
|
|
||||||
try
|
|
||||||
{
|
|
||||||
istr = am.open(BaseDirectory + "/webadmin/" + fileName);
|
|
||||||
} catch( java.io.FileNotFoundException e ) {
|
|
||||||
// Must be a folder :D
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
String outPath = Environment.getExternalStorageDirectory().getPath() + "/mcserver/webadmin/" + fileName;
|
|
||||||
Log.i("MCServer", "outPath: " + outPath );
|
|
||||||
File f = new File( outPath );
|
|
||||||
|
|
||||||
f.getParentFile().mkdirs();
|
|
||||||
f.createNewFile();
|
|
||||||
OutputStream ostr = new FileOutputStream(f);
|
|
||||||
|
|
||||||
byte[] buffer = new byte[1024];
|
|
||||||
int length;
|
|
||||||
while ((length = istr.read(buffer))>0)
|
|
||||||
{
|
|
||||||
ostr.write(buffer, 0, length);
|
|
||||||
}
|
|
||||||
ostr.flush();
|
|
||||||
ostr.close();
|
|
||||||
istr.close();
|
|
||||||
}
|
|
||||||
} catch (IOException e) {
|
|
||||||
e.printStackTrace();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void InstallSinglePlugin( String path )
|
|
||||||
{
|
|
||||||
AssetManager am = mContext.getAssets();
|
|
||||||
try {
|
|
||||||
String[] getImages = am.list(BaseDirectory + "/" + path);
|
|
||||||
for(String imgName : getImages)
|
|
||||||
{
|
|
||||||
Log.i("MCServer", path + "/" + imgName);
|
|
||||||
|
|
||||||
InputStream istr = null;
|
|
||||||
try
|
|
||||||
{
|
|
||||||
istr = am.open(BaseDirectory + "/" + path + "/" + imgName);
|
|
||||||
} catch( java.io.FileNotFoundException e ) {
|
|
||||||
Log.i("MCServer", "Could not open" + path + "/" + imgName );
|
|
||||||
InstallSinglePlugin(path + "/" + imgName);
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
String outPath = Environment.getExternalStorageDirectory().getPath() + "/mcserver/" + path + "/" + imgName;
|
|
||||||
Log.i("MCServer", "outPath: " + outPath );
|
|
||||||
File f = new File( outPath );
|
|
||||||
|
|
||||||
f.getParentFile().mkdirs();
|
|
||||||
f.createNewFile();
|
|
||||||
OutputStream ostr = new FileOutputStream(f);
|
|
||||||
|
|
||||||
byte[] buffer = new byte[1024];
|
|
||||||
int length;
|
|
||||||
while ((length = istr.read(buffer))>0)
|
|
||||||
{
|
|
||||||
ostr.write(buffer, 0, length);
|
|
||||||
}
|
|
||||||
ostr.flush();
|
|
||||||
ostr.close();
|
|
||||||
istr.close();
|
|
||||||
}
|
|
||||||
} catch (IOException e) {
|
|
||||||
e.printStackTrace();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
@ -111,14 +111,14 @@ endif()
|
|||||||
set(BUILD_TOOLS OFF CACHE BOOL "")
|
set(BUILD_TOOLS OFF CACHE BOOL "")
|
||||||
set(SELF_TEST OFF CACHE BOOL "")
|
set(SELF_TEST OFF CACHE BOOL "")
|
||||||
|
|
||||||
# Check whether Lua 5.1 can be used:
|
# Check whether Lua can be used:
|
||||||
if (NOT(DISABLE_SYSTEM_LUA))
|
if (NOT(DISABLE_SYSTEM_LUA))
|
||||||
include(CheckLua.cmake)
|
include(CheckLua.cmake)
|
||||||
if(HAS_LUA_INTERPRETER AND ("${LUA_INTERPRETER_VERSION}" STREQUAL "5.1"))
|
if(HAS_LUA_INTERPRETER)
|
||||||
message(STATUS "Lua 5.1 has been found in your system and will be used for the build.")
|
message(STATUS "Lua has been found in your system and will be used for the build.")
|
||||||
set(USE_SYSTEM_LUA 1)
|
set(USE_SYSTEM_LUA 1)
|
||||||
else()
|
else()
|
||||||
message(STATUS "Lua 5.1 has NOT been found in your system, the build will use its own Lua implementation.")
|
message(STATUS "Lua has NOT been found in your system, the build will use its own Lua implementation.")
|
||||||
unset(USE_SYSTEM_LUA)
|
unset(USE_SYSTEM_LUA)
|
||||||
endif()
|
endif()
|
||||||
else()
|
else()
|
||||||
@ -140,7 +140,6 @@ if(${BUILD_UNSTABLE_TOOLS})
|
|||||||
add_subdirectory(Tools/GeneratorPerformanceTest/)
|
add_subdirectory(Tools/GeneratorPerformanceTest/)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
include(CheckCXXCompilerFlag)
|
|
||||||
include(SetFlags.cmake)
|
include(SetFlags.cmake)
|
||||||
set_flags()
|
set_flags()
|
||||||
set_lib_flags()
|
set_lib_flags()
|
||||||
@ -151,7 +150,6 @@ if (WIN32)
|
|||||||
add_definitions(-DLUA_BUILD_AS_DLL)
|
add_definitions(-DLUA_BUILD_AS_DLL)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
|
|
||||||
# The Expat library is linked in statically, make the source files aware of that:
|
# The Expat library is linked in statically, make the source files aware of that:
|
||||||
add_definitions(-DXML_STATIC)
|
add_definitions(-DXML_STATIC)
|
||||||
|
|
||||||
@ -166,7 +164,7 @@ endif()
|
|||||||
# Build all dependent libraries as static:
|
# Build all dependent libraries as static:
|
||||||
SET(CMAKE_BUILD_STATIC_LIBRARIES ON)
|
SET(CMAKE_BUILD_STATIC_LIBRARIES ON)
|
||||||
|
|
||||||
|
####
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@ -196,40 +194,40 @@ set(JSONCPP_WITH_PKGCONFIG_SUPPORT OFF CACHE BOOL "Generate and install .pc file
|
|||||||
link_directories(lib/jsoncpp/src/lib_json)
|
link_directories(lib/jsoncpp/src/lib_json)
|
||||||
|
|
||||||
# Check that the libraries are present:
|
# Check that the libraries are present:
|
||||||
if (NOT EXISTS ${CMAKE_SOURCE_DIR}/lib/SQLiteCpp/CMakeLists.txt)
|
if (NOT EXISTS ${PROJECT_SOURCE_DIR}/lib/SQLiteCpp/CMakeLists.txt)
|
||||||
message(FATAL_ERROR "SQLiteCpp is missing in folder lib/SQLiteCpp. Have you initialized the submodules / downloaded the extra libraries?")
|
message(FATAL_ERROR "SQLiteCpp is missing in folder lib/SQLiteCpp. Have you initialized the submodules / downloaded the extra libraries?")
|
||||||
endif()
|
endif()
|
||||||
if (NOT EXISTS ${CMAKE_SOURCE_DIR}/lib/polarssl/CMakeLists.txt)
|
if (NOT EXISTS ${PROJECT_SOURCE_DIR}/lib/polarssl/CMakeLists.txt)
|
||||||
message(FATAL_ERROR "PolarSSL is missing in folder lib/polarssl. Have you initialized the submodules / downloaded the extra libraries?")
|
message(FATAL_ERROR "PolarSSL is missing in folder lib/polarssl. Have you initialized the submodules / downloaded the extra libraries?")
|
||||||
endif()
|
endif()
|
||||||
if (NOT EXISTS ${CMAKE_SOURCE_DIR}/lib/libevent/CMakeLists.txt)
|
if (NOT EXISTS ${PROJECT_SOURCE_DIR}/lib/libevent/CMakeLists.txt)
|
||||||
message(FATAL_ERROR "LibEvent is missing in folder lib/libevent. Have you initialized and updated the submodules / downloaded the extra libraries?")
|
message(FATAL_ERROR "LibEvent is missing in folder lib/libevent. Have you initialized and updated the submodules / downloaded the extra libraries?")
|
||||||
endif()
|
endif()
|
||||||
if (NOT EXISTS ${CMAKE_SOURCE_DIR}/lib/jsoncpp/CMakeLists.txt)
|
if (NOT EXISTS ${PROJECT_SOURCE_DIR}/lib/jsoncpp/CMakeLists.txt)
|
||||||
message(FATAL_ERROR "JsonCPP is missing in folder lib/jsoncpp. Have you initialized and updated the submodules / downloaded the extra libraries?")
|
message(FATAL_ERROR "JsonCPP is missing in folder lib/jsoncpp. Have you initialized and updated the submodules / downloaded the extra libraries?")
|
||||||
endif()
|
endif()
|
||||||
if (NOT EXISTS ${CMAKE_SOURCE_DIR}/lib/cmake-coverage/CodeCoverage.cmake)
|
if (NOT EXISTS ${PROJECT_SOURCE_DIR}/lib/cmake-coverage/CodeCoverage.cmake)
|
||||||
message(FATAL_ERROR "cmake-coverage is missing in folder lib/cmake-coverage. Have you initialized and updated the submodules / downloaded the extra libraries?")
|
message(FATAL_ERROR "cmake-coverage is missing in folder lib/cmake-coverage. Have you initialized and updated the submodules / downloaded the extra libraries?")
|
||||||
endif()
|
endif()
|
||||||
if (NOT EXISTS ${CMAKE_SOURCE_DIR}/lib/expat/CMakeLists.txt)
|
if (NOT EXISTS ${PROJECT_SOURCE_DIR}/lib/expat/CMakeLists.txt)
|
||||||
message(FATAL_ERROR "expat is missing in folder lib/expat. Have you initialized and updated the submodules / downloaded the extra libraries?")
|
message(FATAL_ERROR "expat is missing in folder lib/expat. Have you initialized and updated the submodules / downloaded the extra libraries?")
|
||||||
endif()
|
endif()
|
||||||
if (NOT EXISTS ${CMAKE_SOURCE_DIR}/lib/lua/CMakeLists.txt)
|
if (NOT EXISTS ${PROJECT_SOURCE_DIR}/lib/lua/CMakeLists.txt)
|
||||||
message(FATAL_ERROR "lua is missing in folder lib/lua. Have you initialized and updated the submodules / downloaded the extra libraries?")
|
message(FATAL_ERROR "lua is missing in folder lib/lua. Have you initialized and updated the submodules / downloaded the extra libraries?")
|
||||||
endif()
|
endif()
|
||||||
if (NOT EXISTS ${CMAKE_SOURCE_DIR}/lib/luaexpat/CMakeLists.txt)
|
if (NOT EXISTS ${PROJECT_SOURCE_DIR}/lib/luaexpat/CMakeLists.txt)
|
||||||
message(FATAL_ERROR "luaexpat is missing in folder lib/luaexpat. Have you initialized and updated the submodules / downloaded the extra libraries?")
|
message(FATAL_ERROR "luaexpat is missing in folder lib/luaexpat. Have you initialized and updated the submodules / downloaded the extra libraries?")
|
||||||
endif()
|
endif()
|
||||||
if (NOT EXISTS ${CMAKE_SOURCE_DIR}/lib/luaproxy/CMakeLists.txt)
|
if (NOT EXISTS ${PROJECT_SOURCE_DIR}/lib/luaproxy/CMakeLists.txt)
|
||||||
message(FATAL_ERROR "luaproxy is missing in folder lib/luaproxy. Have you initialized and updated the submodules / downloaded the extra libraries?")
|
message(FATAL_ERROR "luaproxy is missing in folder lib/luaproxy. Have you initialized and updated the submodules / downloaded the extra libraries?")
|
||||||
endif()
|
endif()
|
||||||
if (NOT EXISTS ${CMAKE_SOURCE_DIR}/lib/sqlite/CMakeLists.txt)
|
if (NOT EXISTS ${PROJECT_SOURCE_DIR}/lib/sqlite/CMakeLists.txt)
|
||||||
message(FATAL_ERROR "sqlite is missing in folder lib/sqlite. Have you initialized and updated the submodules / downloaded the extra libraries?")
|
message(FATAL_ERROR "sqlite is missing in folder lib/sqlite. Have you initialized and updated the submodules / downloaded the extra libraries?")
|
||||||
endif()
|
endif()
|
||||||
if (NOT EXISTS ${CMAKE_SOURCE_DIR}/lib/tolua++/CMakeLists.txt)
|
if (NOT EXISTS ${PROJECT_SOURCE_DIR}/lib/tolua++/CMakeLists.txt)
|
||||||
message(FATAL_ERROR "tolua++ is missing in folder lib/tolua++. Have you initialized and updated the submodules / downloaded the extra libraries?")
|
message(FATAL_ERROR "tolua++ is missing in folder lib/tolua++. Have you initialized and updated the submodules / downloaded the extra libraries?")
|
||||||
endif()
|
endif()
|
||||||
if (NOT EXISTS ${CMAKE_SOURCE_DIR}/lib/zlib/CMakeLists.txt)
|
if (NOT EXISTS ${PROJECT_SOURCE_DIR}/lib/zlib/CMakeLists.txt)
|
||||||
message(FATAL_ERROR "zlib is missing in folder lib/zlib. Have you initialized and updated the submodules / downloaded the extra libraries?")
|
message(FATAL_ERROR "zlib is missing in folder lib/zlib. Have you initialized and updated the submodules / downloaded the extra libraries?")
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
@ -263,19 +261,18 @@ if (WIN32)
|
|||||||
add_subdirectory(lib/luaproxy/)
|
add_subdirectory(lib/luaproxy/)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
|
|
||||||
# We use EXCLUDE_FROM_ALL so that only the explicit dependencies are used
|
# We use EXCLUDE_FROM_ALL so that only the explicit dependencies are used
|
||||||
# (PolarSSL also has test and example programs in their CMakeLists.txt, we don't want those)
|
# (PolarSSL also has test and example programs in their CMakeLists.txt, we don't want those)
|
||||||
include(lib/polarssl.cmake EXCLUDE_FROM_ALL)
|
include(lib/polarssl.cmake EXCLUDE_FROM_ALL)
|
||||||
|
|
||||||
set_exe_flags()
|
set_exe_flags()
|
||||||
|
|
||||||
add_subdirectory (src)
|
add_subdirectory(src)
|
||||||
|
|
||||||
if(${SELF_TEST})
|
if(${SELF_TEST})
|
||||||
message("Tests enabled")
|
message("Tests enabled")
|
||||||
enable_testing()
|
enable_testing()
|
||||||
add_subdirectory (tests)
|
add_subdirectory(tests)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
# Put projects into solution folders in MSVC:
|
# Put projects into solution folders in MSVC:
|
||||||
|
@ -86,7 +86,13 @@ macro(set_flags)
|
|||||||
else()
|
else()
|
||||||
add_flags_cxx("-pthread")
|
add_flags_cxx("-pthread")
|
||||||
endif()
|
endif()
|
||||||
|
elseif (ANDROID)
|
||||||
|
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++14")
|
||||||
|
set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -std=c++14")
|
||||||
|
set(CMAKE_CXX_FLAGS_COVERAGE "${CMAKE_CXX_FLAGS_COVERAGE} -std=c++14")
|
||||||
|
set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -std=c++14")
|
||||||
|
|
||||||
|
add_flags_cxx("-fsigned-char")
|
||||||
else()
|
else()
|
||||||
# Let gcc / clang know that we're compiling a multi-threaded app:
|
# Let gcc / clang know that we're compiling a multi-threaded app:
|
||||||
if (${UNIX})
|
if (${UNIX})
|
||||||
@ -300,6 +306,7 @@ macro(set_exe_flags)
|
|||||||
endif()
|
endif()
|
||||||
endif()
|
endif()
|
||||||
add_flags_cxx("-Wno-error=unused-command-line-argument")
|
add_flags_cxx("-Wno-error=unused-command-line-argument")
|
||||||
|
add_flags_cxx("-Wno-documentation-unknown-command")
|
||||||
endif()
|
endif()
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
|
5
android/.gitignore
vendored
Normal file
5
android/.gitignore
vendored
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
/Cuberite/
|
||||||
|
/CMakeFiles/
|
||||||
|
/lua_native-prefix/
|
||||||
|
/tolua_native-prefix/
|
||||||
|
CMakeCache.txt
|
32
android/CMakeLists.txt
Normal file
32
android/CMakeLists.txt
Normal file
@ -0,0 +1,32 @@
|
|||||||
|
# Build command:
|
||||||
|
# cmake . -DCMAKE_SYSTEM_NAME=Android -DCMAKE_SYSTEM_VERSION=16 -DCMAKE_BUILD_TYPE=Release -DCMAKE_ANDROID_ARCH_ABI=armeabi -DNATIVE_TOLUA_GENERATOR="" -DCMAKE_ANDROID_NDK=""
|
||||||
|
# -G "MinGW Makefiles" -DCMAKE_MAKE_PROGRAM="" may also be required on Windows
|
||||||
|
|
||||||
|
cmake_minimum_required (VERSION 3.7)
|
||||||
|
project(Cuberite)
|
||||||
|
|
||||||
|
# Set up Android parameters
|
||||||
|
add_definitions(-DANDROID)
|
||||||
|
set(ANDROID TRUE)
|
||||||
|
set(CMAKE_POSITION_INDEPENDENT_CODE TRUE)
|
||||||
|
set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -fPIE -pie")
|
||||||
|
|
||||||
|
# We're crosscompiling for Android
|
||||||
|
set(NO_NATIVE_OPTIMIZATION TRUE)
|
||||||
|
|
||||||
|
# SYSTEM flag to silence warnings for external headers
|
||||||
|
include_directories(SYSTEM
|
||||||
|
../lib/
|
||||||
|
../src/
|
||||||
|
../lib/jsoncpp/include/
|
||||||
|
../lib/polarssl/include/
|
||||||
|
../lib/sqlitecpp/include/
|
||||||
|
../lib/sqlitecpp/sqlite3/
|
||||||
|
../lib/libevent/include/
|
||||||
|
)
|
||||||
|
|
||||||
|
# Disable some compiler warnings (the lazy way out)
|
||||||
|
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-double-promotion")
|
||||||
|
|
||||||
|
# Build the rest of the server
|
||||||
|
add_subdirectory(../ Cuberite)
|
@ -1 +1 @@
|
|||||||
Subproject commit 3e2c10a7b3b795ce594b3cb2d0e232632e642c78
|
Subproject commit 1a9d45c3391b4592d53a3e274d515f86e409c0c7
|
2
lib/lua
2
lib/lua
@ -1 +1 @@
|
|||||||
Subproject commit 966e06975699f51022474b39629dbad9c0fcf0bf
|
Subproject commit 7dfee332d4766424eff2780d569c89ce69ddc60f
|
@ -1 +1 @@
|
|||||||
Subproject commit 5d69f56b06fdfe1e67cd2572083abb863ec3b708
|
Subproject commit c4cb9a5c6079ffa2e03b8e7533dc7175a19f25a3
|
@ -159,7 +159,7 @@ set_source_files_properties(${BINDING_OUTPUTS} PROPERTIES GENERATED TRUE)
|
|||||||
set_source_files_properties(${CMAKE_SOURCE_DIR}/src/Bindings/Bindings.cpp PROPERTIES COMPILE_FLAGS -Wno-error)
|
set_source_files_properties(${CMAKE_SOURCE_DIR}/src/Bindings/Bindings.cpp PROPERTIES COMPILE_FLAGS -Wno-error)
|
||||||
|
|
||||||
if("${CMAKE_CXX_COMPILER_ID}" STREQUAL "Clang")
|
if("${CMAKE_CXX_COMPILER_ID}" STREQUAL "Clang")
|
||||||
set_source_files_properties(${CMAKE_SOURCE_DIR}/src/Bindings/Bindings.cpp PROPERTIES COMPILE_FLAGS ${COMPILE_FLAGS} "-Wno-old-style-cast -Wno-missing-prototypes")
|
set_source_files_properties(Bindings.cpp PROPERTIES COMPILE_FLAGS ${COMPILE_FLAGS} "-Wno-old-style-cast -Wno-missing-prototypes")
|
||||||
set_source_files_properties(LuaWindow.cpp PROPERTIES COMPILE_FLAGS "-Wno-error=switch-enum")
|
set_source_files_properties(LuaWindow.cpp PROPERTIES COMPILE_FLAGS "-Wno-error=switch-enum")
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
|
@ -22,27 +22,6 @@ Unfortunately it is very slow, so it is disabled even for regular DEBUG builds.
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
// Try to determine endianness:
|
|
||||||
#if ( \
|
|
||||||
defined(__i386__) || defined(__alpha__) || \
|
|
||||||
defined(__ia64) || defined(__ia64__) || \
|
|
||||||
defined(_M_IX86) || defined(_M_IA64) || \
|
|
||||||
defined(_M_ALPHA) || defined(__amd64) || \
|
|
||||||
defined(__amd64__) || defined(_M_AMD64) || \
|
|
||||||
defined(__x86_64) || defined(__x86_64__) || \
|
|
||||||
defined(_M_X64) || defined(__bfin__) || \
|
|
||||||
defined(__ARMEL__) || defined(__AARCH64EL__) || \
|
|
||||||
(defined(_WIN32) && defined(__ARM__) && defined(_MSC_VER)) \
|
|
||||||
)
|
|
||||||
#define IS_LITTLE_ENDIAN
|
|
||||||
#elif ( \
|
|
||||||
defined (__ARMEB__) || defined(__sparc) || defined(__powerpc__) || defined(__POWERPC__) \
|
|
||||||
)
|
|
||||||
#define IS_BIG_ENDIAN
|
|
||||||
#else
|
|
||||||
#error Cannot determine endianness of this platform
|
|
||||||
#endif
|
|
||||||
|
|
||||||
// If a string sent over the protocol is larger than this, a warning is emitted to the console
|
// If a string sent over the protocol is larger than this, a warning is emitted to the console
|
||||||
#define MAX_STRING_SIZE (512 KiB)
|
#define MAX_STRING_SIZE (512 KiB)
|
||||||
|
|
||||||
@ -754,22 +733,6 @@ bool cByteBuffer::WriteVarUTF8String(const AString & a_Value)
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
bool cByteBuffer::WriteLEInt32(Int32 a_Value)
|
|
||||||
{
|
|
||||||
CHECK_THREAD
|
|
||||||
CheckValid();
|
|
||||||
#ifdef IS_LITTLE_ENDIAN
|
|
||||||
return WriteBuf(reinterpret_cast<const char *>(&a_Value), 4);
|
|
||||||
#else
|
|
||||||
int Value = ((a_Value >> 24) & 0xff) | ((a_Value >> 16) & 0xff00) | ((a_Value >> 8) & 0xff0000) | (a_Value & 0xff000000);
|
|
||||||
return WriteBuf(reinterpret_cast<const char *>(&Value), 4);
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
bool cByteBuffer::WritePosition64(Int32 a_BlockX, Int32 a_BlockY, Int32 a_BlockZ)
|
bool cByteBuffer::WritePosition64(Int32 a_BlockX, Int32 a_BlockY, Int32 a_BlockZ)
|
||||||
{
|
{
|
||||||
CHECK_THREAD
|
CHECK_THREAD
|
||||||
|
@ -290,9 +290,6 @@ foreach(arg ${ALLFILES})
|
|||||||
endforeach()
|
endforeach()
|
||||||
FILE(WRITE "AllFiles.lst" "${ALLFILESLINES}")
|
FILE(WRITE "AllFiles.lst" "${ALLFILESLINES}")
|
||||||
|
|
||||||
|
|
||||||
set(EXECUTABLE Cuberite)
|
|
||||||
|
|
||||||
if (MSVC)
|
if (MSVC)
|
||||||
get_directory_property(BINDING_OUTPUTS DIRECTORY "Bindings" DEFINITION BINDING_OUTPUTS)
|
get_directory_property(BINDING_OUTPUTS DIRECTORY "Bindings" DEFINITION BINDING_OUTPUTS)
|
||||||
get_directory_property(BINDING_DEPENDENCIES DIRECTORY "Bindings" DEFINITION BINDING_DEPENDENCIES)
|
get_directory_property(BINDING_DEPENDENCIES DIRECTORY "Bindings" DEFINITION BINDING_DEPENDENCIES)
|
||||||
@ -324,46 +321,45 @@ if (MSVC)
|
|||||||
endif()
|
endif()
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
add_executable(${EXECUTABLE} ${SOURCE})
|
|
||||||
|
|
||||||
|
add_executable(${CMAKE_PROJECT_NAME} ${SOURCE})
|
||||||
|
|
||||||
# Output the executable into the $/Server folder, so that it has access to external resources:
|
# Output the executable into the $/Server folder, so that it has access to external resources:
|
||||||
set(EXECUTABLE_OUTPUT_PATH ${CMAKE_SOURCE_DIR}/Server)
|
SET_TARGET_PROPERTIES(${CMAKE_PROJECT_NAME} PROPERTIES
|
||||||
SET_TARGET_PROPERTIES(${EXECUTABLE} PROPERTIES
|
|
||||||
RUNTIME_OUTPUT_DIRECTORY_DEBUG ${CMAKE_SOURCE_DIR}/Server
|
RUNTIME_OUTPUT_DIRECTORY_DEBUG ${CMAKE_SOURCE_DIR}/Server
|
||||||
RUNTIME_OUTPUT_DIRECTORY_RELEASE ${CMAKE_SOURCE_DIR}/Server
|
RUNTIME_OUTPUT_DIRECTORY_RELEASE ${CMAKE_SOURCE_DIR}/Server
|
||||||
RUNTIME_OUTPUT_DIRECTORY_DEBUGPROFILE ${CMAKE_SOURCE_DIR}/Server
|
RUNTIME_OUTPUT_DIRECTORY_DEBUGPROFILE ${CMAKE_SOURCE_DIR}/Server
|
||||||
RUNTIME_OUTPUT_DIRECTORY_RELEASEPROFILE ${CMAKE_SOURCE_DIR}/Server
|
RUNTIME_OUTPUT_DIRECTORY_RELEASEPROFILE ${CMAKE_SOURCE_DIR}/Server
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
# Make the debug executable have a "_debug" suffix
|
# Make the debug executable have a "_debug" suffix
|
||||||
SET_TARGET_PROPERTIES(${EXECUTABLE} PROPERTIES DEBUG_POSTFIX "_debug")
|
SET_TARGET_PROPERTIES(${CMAKE_PROJECT_NAME} PROPERTIES DEBUG_POSTFIX "_debug")
|
||||||
|
|
||||||
# Make the profiled executables have a "_profile" postfix
|
# Make the profiled executables have a "_profile" postfix
|
||||||
SET_TARGET_PROPERTIES(${EXECUTABLE} PROPERTIES DEBUGPROFILE_POSTFIX "_debug_profile")
|
SET_TARGET_PROPERTIES(${CMAKE_PROJECT_NAME} PROPERTIES DEBUGPROFILE_POSTFIX "_debug_profile")
|
||||||
SET_TARGET_PROPERTIES(${EXECUTABLE} PROPERTIES RELEASEPROFILE_POSTFIX "_profile")
|
SET_TARGET_PROPERTIES(${CMAKE_PROJECT_NAME} PROPERTIES RELEASEPROFILE_POSTFIX "_profile")
|
||||||
|
|
||||||
|
|
||||||
# Precompiled headers (2nd part)
|
# Precompiled headers (2nd part)
|
||||||
if (MSVC)
|
if (MSVC)
|
||||||
SET_TARGET_PROPERTIES(
|
SET_TARGET_PROPERTIES(
|
||||||
${EXECUTABLE} PROPERTIES COMPILE_FLAGS "/Yu\"Globals.h\""
|
${CMAKE_PROJECT_NAME} PROPERTIES COMPILE_FLAGS "/Yu\"Globals.h\""
|
||||||
OBJECT_DEPENDS "$(IntDir)/$(TargetName.pch)"
|
OBJECT_DEPENDS "$(IntDir)/$(TargetName.pch)"
|
||||||
)
|
)
|
||||||
endif ()
|
endif ()
|
||||||
|
|
||||||
|
|
||||||
if (NOT MSVC)
|
if (NOT MSVC)
|
||||||
target_link_libraries(${EXECUTABLE}
|
target_link_libraries(${CMAKE_PROJECT_NAME}
|
||||||
OSSupport HTTPServer Bindings Items Blocks Noise
|
OSSupport HTTPServer Bindings Items Blocks Noise
|
||||||
Protocol Generating WorldStorage
|
Protocol Generating WorldStorage
|
||||||
Mobs Entities Simulator IncrementalRedstoneSimulator
|
Mobs Entities Simulator IncrementalRedstoneSimulator
|
||||||
BlockEntities UI PolarSSL++
|
BlockEntities UI PolarSSL++
|
||||||
)
|
)
|
||||||
endif ()
|
endif ()
|
||||||
|
|
||||||
if (WIN32)
|
if (WIN32)
|
||||||
target_link_libraries(${EXECUTABLE} expat tolualib ws2_32.lib Psapi.lib)
|
target_link_libraries(${CMAKE_PROJECT_NAME} expat tolualib ws2_32.lib Psapi.lib)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
if (${CMAKE_SYSTEM_NAME} STREQUAL "FreeBSD")
|
if (${CMAKE_SYSTEM_NAME} STREQUAL "FreeBSD")
|
||||||
@ -371,7 +367,7 @@ if (${CMAKE_SYSTEM_NAME} STREQUAL "FreeBSD")
|
|||||||
add_flags_lnk(-L/usr/ports/devel)
|
add_flags_lnk(-L/usr/ports/devel)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
target_link_libraries(${EXECUTABLE} luaexpat jsoncpp_lib_static mbedtls zlib sqlite lua SQLiteCpp event_core event_extra)
|
target_link_libraries(${CMAKE_PROJECT_NAME} luaexpat jsoncpp_lib_static mbedtls zlib sqlite lua SQLiteCpp event_core event_extra)
|
||||||
|
|
||||||
# Create a folder for Bindings' documentation:
|
# Create a folder for Bindings' documentation:
|
||||||
FILE(MAKE_DIRECTORY "Bindings/docs")
|
FILE(MAKE_DIRECTORY "Bindings/docs")
|
||||||
|
@ -55,7 +55,7 @@ class cClientHandle // tolua_export
|
|||||||
{ // tolua_export
|
{ // tolua_export
|
||||||
public: // tolua_export
|
public: // tolua_export
|
||||||
|
|
||||||
#if defined(ANDROID_NDK)
|
#if defined(ANDROID)
|
||||||
static const int DEFAULT_VIEW_DISTANCE = 4; // The default ViewDistance (used when no value is set in Settings.ini)
|
static const int DEFAULT_VIEW_DISTANCE = 4; // The default ViewDistance (used when no value is set in Settings.ini)
|
||||||
#else
|
#else
|
||||||
static const int DEFAULT_VIEW_DISTANCE = 10;
|
static const int DEFAULT_VIEW_DISTANCE = 10;
|
||||||
|
@ -6,7 +6,7 @@
|
|||||||
|
|
||||||
#include <fstream>
|
#include <fstream>
|
||||||
|
|
||||||
#define FURNACE_RECIPE_FILE "furnace.txt"
|
#define FURNACE_RECIPE_FILE FILE_IO_PREFIX "furnace.txt"
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@ -70,6 +70,10 @@ void cFurnaceRecipe::ReloadRecipes(void)
|
|||||||
LineNum++;
|
LineNum++;
|
||||||
if (ParsingLine.empty())
|
if (ParsingLine.empty())
|
||||||
{
|
{
|
||||||
|
// There is a problem here on Android. Text files transferred from another OS may have a newline representation Android's implementation of getline doesn't expect
|
||||||
|
// Thus, part of a newline may be left in ParsingLine. ::empty() thus thinks the string isn't empty, and the below code outputs interesting errors since it was passed a nearly empty string
|
||||||
|
// Ref: http://stackoverflow.com/questions/6089231/getting-std-ifstream-to-handle-lf-cr-and-crlf
|
||||||
|
// TODO: There is a solution in the above reference, but it isn't very pretty. Fix it somehow.
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -8,14 +8,12 @@
|
|||||||
#if defined(_WIN32)
|
#if defined(_WIN32)
|
||||||
#include <io.h> // Needed for _isatty(), not available on Linux
|
#include <io.h> // Needed for _isatty(), not available on Linux
|
||||||
#include <time.h>
|
#include <time.h>
|
||||||
#elif defined(__linux) && !defined(ANDROID_NDK)
|
#elif defined(__linux)
|
||||||
#include <unistd.h> // Needed for isatty() on Linux
|
#include <unistd.h> // Needed for isatty() on Linux
|
||||||
#elif defined(ANDROID_NDK)
|
|
||||||
#include <android/log.h>
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
#if defined(_WIN32) || (defined (__linux) && !defined(ANDROID_NDK))
|
#if defined(_WIN32) || defined (__linux)
|
||||||
class cColouredConsoleListener
|
class cColouredConsoleListener
|
||||||
: public cLogger::cListener
|
: public cLogger::cListener
|
||||||
{
|
{
|
||||||
@ -107,7 +105,7 @@
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
#elif defined (__linux) && !defined(ANDROID_NDK)
|
#elif defined (__linux)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@ -154,46 +152,6 @@
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
#elif defined(ANDROID_NDK)
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
class cAndroidConsoleListener
|
|
||||||
: public cLogger::cListener
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
virtual void Log(AString a_Message, cLogger::eLogLevel a_LogLevel) override
|
|
||||||
{
|
|
||||||
android_LogPriority AndroidLogLevel;
|
|
||||||
switch (a_LogLevel)
|
|
||||||
{
|
|
||||||
case cLogger::llRegular:
|
|
||||||
{
|
|
||||||
AndroidLogLevel = ANDROID_LOG_VERBOSE;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case cLogger::llInfo:
|
|
||||||
{
|
|
||||||
AndroidLogLevel = ANDROID_LOG_INFO;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case cLogger::llWarning:
|
|
||||||
{
|
|
||||||
AndroidLogLevel = ANDROID_LOG_WARNING;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case cLogger::llError:
|
|
||||||
{
|
|
||||||
AndroidLogLevel = ANDROID_LOG_ERROR;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
__android_log_print(AndroidLogLevel, "Cuberite", "%s", a_Message.c_str());
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
@ -273,8 +231,7 @@ std::unique_ptr<cLogger::cListener> MakeConsoleListener(bool a_IsService)
|
|||||||
{
|
{
|
||||||
return cpp14::make_unique<cVanillaCPPConsoleListener>();
|
return cpp14::make_unique<cVanillaCPPConsoleListener>();
|
||||||
}
|
}
|
||||||
|
#elif defined (__linux) && !defined(ANDROID)
|
||||||
#elif defined (__linux) && !defined(ANDROID_NDK)
|
|
||||||
// TODO: lookup terminal in terminfo
|
// TODO: lookup terminal in terminfo
|
||||||
if (isatty(fileno(stdout)))
|
if (isatty(fileno(stdout)))
|
||||||
{
|
{
|
||||||
@ -306,7 +263,7 @@ public:
|
|||||||
bool Open()
|
bool Open()
|
||||||
{
|
{
|
||||||
// Assume creation succeeds, as the API does not provide a way to tell if the folder exists.
|
// Assume creation succeeds, as the API does not provide a way to tell if the folder exists.
|
||||||
cFile::CreateFolder(FILE_IO_PREFIX + AString("logs"));
|
cFile::CreateFolder(FILE_IO_PREFIX "logs");
|
||||||
bool success = m_File.Open(
|
bool success = m_File.Open(
|
||||||
FILE_IO_PREFIX + Printf(
|
FILE_IO_PREFIX + Printf(
|
||||||
"logs/LOG_%d.txt",
|
"logs/LOG_%d.txt",
|
||||||
|
@ -43,12 +43,4 @@ endif()
|
|||||||
|
|
||||||
if(NOT MSVC)
|
if(NOT MSVC)
|
||||||
add_library(OSSupport ${SRCS} ${HDRS})
|
add_library(OSSupport ${SRCS} ${HDRS})
|
||||||
|
|
||||||
if(UNIX)
|
|
||||||
if(NOT APPLE)
|
|
||||||
target_link_libraries(OSSupport rt)
|
|
||||||
endif()
|
|
||||||
|
|
||||||
target_link_libraries(OSSupport pthread event_core event_extra)
|
|
||||||
endif()
|
|
||||||
endif()
|
endif()
|
||||||
|
@ -22,7 +22,7 @@ AString GetOSErrorString( 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 defined(__GLIBC__) && defined( _GNU_SOURCE) && !defined(ANDROID_NDK) // GNU version of strerror_r()
|
#if defined(__GLIBC__) && defined( _GNU_SOURCE) && !defined(ANDROID) // GNU version of strerror_r()
|
||||||
|
|
||||||
char * res = strerror_r( errno, buffer, ARRAYCOUNT(buffer));
|
char * res = strerror_r( errno, buffer, ARRAYCOUNT(buffer));
|
||||||
if (res != nullptr)
|
if (res != nullptr)
|
||||||
|
@ -653,9 +653,13 @@ unsigned cFile::GetLastModificationTime(const AString & a_FileName)
|
|||||||
{
|
{
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
#ifdef _WIN32
|
#if defined(_WIN32)
|
||||||
// Windows returns times in local time already
|
// Windows returns times in local time already
|
||||||
return static_cast<unsigned>(st.st_mtime);
|
return static_cast<unsigned>(st.st_mtime);
|
||||||
|
#elif defined(ANDROID)
|
||||||
|
// Identical to Linux below, but st_mtime is an unsigned long, so cast is needed:
|
||||||
|
auto Time = static_cast<time_t>(st.st_mtime);
|
||||||
|
return static_cast<unsigned>(mktime(localtime(&Time)));
|
||||||
#else
|
#else
|
||||||
// Linux returns UTC time, convert to local timezone:
|
// Linux returns UTC time, convert to local timezone:
|
||||||
return static_cast<unsigned>(mktime(localtime(&st.st_mtime)));
|
return static_cast<unsigned>(mktime(localtime(&st.st_mtime)));
|
||||||
|
@ -7,10 +7,10 @@
|
|||||||
#include "Network.h"
|
#include "Network.h"
|
||||||
#include "event2/util.h"
|
#include "event2/util.h"
|
||||||
|
|
||||||
#ifdef _WIN32
|
#if defined(_WIN32)
|
||||||
#include <IPHlpApi.h>
|
#include <IPHlpApi.h>
|
||||||
#pragma comment(lib, "IPHLPAPI.lib")
|
#pragma comment(lib, "IPHLPAPI.lib")
|
||||||
#else // _WIN32
|
#elif !defined(ANDROID) // _WIN32
|
||||||
#include <sys/types.h>
|
#include <sys/types.h>
|
||||||
#include <ifaddrs.h>
|
#include <ifaddrs.h>
|
||||||
#include <netinet/in.h>
|
#include <netinet/in.h>
|
||||||
@ -21,7 +21,7 @@
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
#ifdef _WIN32
|
#if defined(_WIN32)
|
||||||
|
|
||||||
/** Converts the SOCKET_ADDRESS structure received from the OS into an IP address string. */
|
/** Converts the SOCKET_ADDRESS structure received from the OS into an IP address string. */
|
||||||
static AString PrintAddress(SOCKET_ADDRESS & a_Addr)
|
static AString PrintAddress(SOCKET_ADDRESS & a_Addr)
|
||||||
@ -50,7 +50,7 @@ static AString PrintAddress(SOCKET_ADDRESS & a_Addr)
|
|||||||
return IP;
|
return IP;
|
||||||
}
|
}
|
||||||
|
|
||||||
#else // _WIN32
|
#elif !defined(ANDROID) // _WIN32
|
||||||
|
|
||||||
static AString PrintAddress(ifaddrs * InterfaceAddress)
|
static AString PrintAddress(ifaddrs * InterfaceAddress)
|
||||||
{
|
{
|
||||||
@ -82,7 +82,7 @@ static AString PrintAddress(ifaddrs * InterfaceAddress)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif // else _WIN32
|
#endif // else !ANDROID
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@ -92,7 +92,7 @@ AStringVector cNetwork::EnumLocalIPAddresses(void)
|
|||||||
{
|
{
|
||||||
AStringVector res;
|
AStringVector res;
|
||||||
|
|
||||||
#ifdef _WIN32
|
#if defined(_WIN32)
|
||||||
|
|
||||||
// Query the OS for all adapters' addresses:
|
// Query the OS for all adapters' addresses:
|
||||||
char buffer[64 KiB]; // A buffer backing the address list
|
char buffer[64 KiB]; // A buffer backing the address list
|
||||||
@ -129,7 +129,7 @@ AStringVector cNetwork::EnumLocalIPAddresses(void)
|
|||||||
} // for pUnicast
|
} // for pUnicast
|
||||||
} // for pCurrAddresses
|
} // for pCurrAddresses
|
||||||
|
|
||||||
#else // _WIN32
|
#elif !defined(ANDROID) // _WIN32
|
||||||
|
|
||||||
struct ifaddrs * ifAddrStruct = nullptr;
|
struct ifaddrs * ifAddrStruct = nullptr;
|
||||||
getifaddrs(&ifAddrStruct);
|
getifaddrs(&ifAddrStruct);
|
||||||
|
@ -13,6 +13,11 @@
|
|||||||
#include "IPLookup.h"
|
#include "IPLookup.h"
|
||||||
#include "HostnameLookup.h"
|
#include "HostnameLookup.h"
|
||||||
|
|
||||||
|
#ifdef ANDROID
|
||||||
|
// For DNS server retrieval
|
||||||
|
#include <sys/system_properties.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@ -89,6 +94,16 @@ void cNetworkSingleton::Initialise(void)
|
|||||||
abort();
|
abort();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef ANDROID
|
||||||
|
char PropertyBuffer[PROP_VALUE_MAX];
|
||||||
|
|
||||||
|
__system_property_get("net.dns1", PropertyBuffer);
|
||||||
|
evdns_base_nameserver_ip_add(m_DNSBase, PropertyBuffer);
|
||||||
|
|
||||||
|
__system_property_get("net.dns2", PropertyBuffer);
|
||||||
|
evdns_base_nameserver_ip_add(m_DNSBase, PropertyBuffer);
|
||||||
|
#endif
|
||||||
|
|
||||||
// Create the event loop thread:
|
// Create the event loop thread:
|
||||||
m_HasTerminated = false;
|
m_HasTerminated = false;
|
||||||
m_EventLoopThread = std::thread(RunEventLoop, this);
|
m_EventLoopThread = std::thread(RunEventLoop, this);
|
||||||
|
@ -7,7 +7,7 @@
|
|||||||
#include "StackTrace.h"
|
#include "StackTrace.h"
|
||||||
#ifdef _WIN32
|
#ifdef _WIN32
|
||||||
#include "../StackWalker.h"
|
#include "../StackWalker.h"
|
||||||
#else
|
#elif !defined(ANDROID) // The Android NDK has no execinfo header
|
||||||
#ifdef __GLIBC__
|
#ifdef __GLIBC__
|
||||||
#include <execinfo.h>
|
#include <execinfo.h>
|
||||||
#endif
|
#endif
|
||||||
@ -32,7 +32,7 @@ void PrintStackTrace(void)
|
|||||||
}
|
}
|
||||||
} sw;
|
} sw;
|
||||||
sw.ShowCallstack();
|
sw.ShowCallstack();
|
||||||
#else
|
#elif !defined(ANDROID)
|
||||||
#ifdef __GLIBC__
|
#ifdef __GLIBC__
|
||||||
// Use the backtrace() function to get and output the stackTrace:
|
// Use the backtrace() function to get and output the stackTrace:
|
||||||
// Code adapted from https://stackoverflow.com/questions/77005/how-to-generate-a-stacktrace-when-my-gcc-c-app-crashes
|
// Code adapted from https://stackoverflow.com/questions/77005/how-to-generate-a-stacktrace-when-my-gcc-c-app-crashes
|
||||||
|
@ -207,7 +207,6 @@ void cRoot::Start(std::unique_ptr<cSettingsRepositoryInterface> a_OverridesRepo)
|
|||||||
{
|
{
|
||||||
m_WebAdmin->Start();
|
m_WebAdmin->Start();
|
||||||
|
|
||||||
#if !defined(ANDROID_NDK)
|
|
||||||
LOGD("Starting InputThread...");
|
LOGD("Starting InputThread...");
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
@ -218,7 +217,6 @@ void cRoot::Start(std::unique_ptr<cSettingsRepositoryInterface> a_OverridesRepo)
|
|||||||
{
|
{
|
||||||
LOGERROR("cRoot::Start (std::thread) error %i: could not construct input thread; %s", a_Exception.code().value(), a_Exception.what());
|
LOGERROR("cRoot::Start (std::thread) error %i: could not construct input thread; %s", a_Exception.code().value(), a_Exception.what());
|
||||||
}
|
}
|
||||||
#endif
|
|
||||||
|
|
||||||
LOG("Startup complete, took %ldms!", static_cast<long int>(std::chrono::duration_cast<std::chrono::milliseconds>(std::chrono::steady_clock::now() - BeginTime).count()));
|
LOG("Startup complete, took %ldms!", static_cast<long int>(std::chrono::duration_cast<std::chrono::milliseconds>(std::chrono::steady_clock::now() - BeginTime).count()));
|
||||||
|
|
||||||
|
@ -5,10 +5,6 @@
|
|||||||
|
|
||||||
#include "Globals.h"
|
#include "Globals.h"
|
||||||
|
|
||||||
#if defined(ANDROID_NDK)
|
|
||||||
#include <ctype.h>
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef _MSC_VER
|
#ifdef _MSC_VER
|
||||||
// Under MSVC, link to WinSock2 (needed by RawBEToUTF8's byteswapping)
|
// Under MSVC, link to WinSock2 (needed by RawBEToUTF8's byteswapping)
|
||||||
#pragma comment(lib, "ws2_32.lib")
|
#pragma comment(lib, "ws2_32.lib")
|
||||||
|
@ -354,7 +354,7 @@ bool cWorld::SetSpawn(double a_X, double a_Y, double a_Z)
|
|||||||
void cWorld::InitializeSpawn(void)
|
void cWorld::InitializeSpawn(void)
|
||||||
{
|
{
|
||||||
// For the debugging builds, don't make the server build too much world upon start:
|
// For the debugging builds, don't make the server build too much world upon start:
|
||||||
#if defined(_DEBUG) || defined(ANDROID_NDK)
|
#if defined(_DEBUG) || defined(ANDROID)
|
||||||
const int DefaultViewDist = 9;
|
const int DefaultViewDist = 9;
|
||||||
#else
|
#else
|
||||||
const int DefaultViewDist = 20; // Always prepare an area 20 chunks across, no matter what the actual cClientHandle::VIEWDISTANCE is
|
const int DefaultViewDist = 20; // Always prepare an area 20 chunks across, no matter what the actual cClientHandle::VIEWDISTANCE is
|
||||||
|
18
src/main.cpp
18
src/main.cpp
@ -8,6 +8,20 @@
|
|||||||
#include <csignal>
|
#include <csignal>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
|
|
||||||
|
#ifdef ANDROID
|
||||||
|
// Workaround for Android NDK builds that do not support std::to_string
|
||||||
|
namespace std
|
||||||
|
{
|
||||||
|
template <typename T>
|
||||||
|
std::string to_string(T Value)
|
||||||
|
{
|
||||||
|
std::ostringstream TempStream;
|
||||||
|
TempStream << Value;
|
||||||
|
return TempStream.str();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
#ifdef _MSC_VER
|
#ifdef _MSC_VER
|
||||||
#include <dbghelp.h>
|
#include <dbghelp.h>
|
||||||
#endif // _MSC_VER
|
#endif // _MSC_VER
|
||||||
@ -223,14 +237,11 @@ static void UniversalMain(std::unique_ptr<cSettingsRepositoryInterface> a_Overri
|
|||||||
// Initialize LibEvent:
|
// Initialize LibEvent:
|
||||||
cNetworkSingleton::Get().Initialise();
|
cNetworkSingleton::Get().Initialise();
|
||||||
|
|
||||||
#if !defined(ANDROID_NDK)
|
|
||||||
try
|
try
|
||||||
#endif
|
|
||||||
{
|
{
|
||||||
cRoot Root;
|
cRoot Root;
|
||||||
Root.Start(std::move(a_OverridesRepo));
|
Root.Start(std::move(a_OverridesRepo));
|
||||||
}
|
}
|
||||||
#if !defined(ANDROID_NDK)
|
|
||||||
catch (std::exception & e)
|
catch (std::exception & e)
|
||||||
{
|
{
|
||||||
LOGERROR("Standard exception: %s", e.what());
|
LOGERROR("Standard exception: %s", e.what());
|
||||||
@ -239,7 +250,6 @@ static void UniversalMain(std::unique_ptr<cSettingsRepositoryInterface> a_Overri
|
|||||||
{
|
{
|
||||||
LOGERROR("Unknown exception!");
|
LOGERROR("Unknown exception!");
|
||||||
}
|
}
|
||||||
#endif
|
|
||||||
|
|
||||||
// Shutdown all of LibEvent:
|
// Shutdown all of LibEvent:
|
||||||
cNetworkSingleton::Get().Terminate();
|
cNetworkSingleton::Get().Terminate();
|
||||||
|
Loading…
Reference in New Issue
Block a user