1
0

Use CMake's Android generators to crosscompile

This commit is contained in:
Tiger Wang 2016-11-07 22:15:07 +00:00 committed by Alexander Harkness
parent c59ff9b431
commit 8c6d0b51c7
49 changed files with 149 additions and 1408 deletions

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -1 +0,0 @@
Put pre-packaged webadmin template in here

View File

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

View File

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

View File

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

View File

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

View File

@ -1,3 +0,0 @@
#include "Globals.h"
#include "ToJava.h"

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

@ -0,0 +1,5 @@
/Cuberite/
/CMakeFiles/
/lua_native-prefix/
/tolua_native-prefix/
CMakeCache.txt

32
android/CMakeLists.txt Normal file
View 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

@ -1 +1 @@
Subproject commit 966e06975699f51022474b39629dbad9c0fcf0bf Subproject commit 7dfee332d4766424eff2780d569c89ce69ddc60f

@ -1 +1 @@
Subproject commit 5d69f56b06fdfe1e67cd2572083abb863ec3b708 Subproject commit c4cb9a5c6079ffa2e03b8e7533dc7175a19f25a3

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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