forked from Mirrorlandia_minetest/minetest
Android: add Android Studio support, completely redone java part (#9066)
This commit is contained in:
parent
8ae8c1600a
commit
62ae7adab2
20
.gitignore
vendored
20
.gitignore
vendored
@ -3,6 +3,7 @@
|
|||||||
*.swp
|
*.swp
|
||||||
*.bak*
|
*.bak*
|
||||||
*.orig
|
*.orig
|
||||||
|
.DS_Store
|
||||||
# Vim
|
# Vim
|
||||||
*.vim
|
*.vim
|
||||||
# Kate
|
# Kate
|
||||||
@ -77,17 +78,11 @@ doc/mkdocs/mkdocs.yml
|
|||||||
## Build files
|
## Build files
|
||||||
CMakeFiles
|
CMakeFiles
|
||||||
Makefile
|
Makefile
|
||||||
!build/android/Makefile
|
|
||||||
build/android/path.cfg
|
|
||||||
build/android/*.apk
|
|
||||||
build/android/.externalNativeBuild
|
|
||||||
cmake_install.cmake
|
cmake_install.cmake
|
||||||
CMakeCache.txt
|
CMakeCache.txt
|
||||||
CPackConfig.cmake
|
CPackConfig.cmake
|
||||||
CPackSourceConfig.cmake
|
CPackSourceConfig.cmake
|
||||||
src/test_config.h
|
src/test_config.h
|
||||||
src/android_version.h
|
|
||||||
src/android_version_githash.h
|
|
||||||
src/cmake_config.h
|
src/cmake_config.h
|
||||||
src/cmake_config_githash.h
|
src/cmake_config_githash.h
|
||||||
src/unittest/test_world/world.mt
|
src/unittest/test_world/world.mt
|
||||||
@ -109,16 +104,3 @@ cmake_config.h
|
|||||||
cmake_config_githash.h
|
cmake_config_githash.h
|
||||||
CMakeDoxy*
|
CMakeDoxy*
|
||||||
compile_commands.json
|
compile_commands.json
|
||||||
|
|
||||||
## Android build files
|
|
||||||
build/android/src/main/assets
|
|
||||||
build/android/build
|
|
||||||
build/android/deps
|
|
||||||
build/android/libs
|
|
||||||
build/android/jni/lib
|
|
||||||
build/android/jni/src
|
|
||||||
build/android/src/main/jniLibs
|
|
||||||
build/android/obj
|
|
||||||
build/android/local.properties
|
|
||||||
build/android/.gradle
|
|
||||||
timestamp
|
|
||||||
|
11
build/android/.gitignore
vendored
Normal file
11
build/android/.gitignore
vendored
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
*.iml
|
||||||
|
.externalNativeBuild
|
||||||
|
.gradle
|
||||||
|
app/build
|
||||||
|
app/release
|
||||||
|
app/src/main/assets
|
||||||
|
build
|
||||||
|
local.properties
|
||||||
|
native/.*
|
||||||
|
native/build
|
||||||
|
native/deps
|
@ -1,763 +0,0 @@
|
|||||||
# build options
|
|
||||||
|
|
||||||
OS := $(shell uname)
|
|
||||||
|
|
||||||
# compile with GPROF
|
|
||||||
# GPROF = 1
|
|
||||||
|
|
||||||
# build for build platform
|
|
||||||
API = 14
|
|
||||||
APP_PLATFORM = android-$(API)
|
|
||||||
|
|
||||||
ANDR_ROOT = $(shell pwd)
|
|
||||||
PROJ_ROOT = $(shell realpath $(ANDR_ROOT)/../..)
|
|
||||||
APP_ROOT = $(ANDR_ROOT)/src/main
|
|
||||||
|
|
||||||
VERSION_MAJOR := $(shell cat $(PROJ_ROOT)/CMakeLists.txt | \
|
|
||||||
grep ^set\(VERSION_MAJOR\ | sed 's/)/ /' | cut -f2 -d' ')
|
|
||||||
VERSION_MINOR := $(shell cat $(PROJ_ROOT)/CMakeLists.txt | \
|
|
||||||
grep ^set\(VERSION_MINOR\ | sed 's/)/ /' | cut -f2 -d' ')
|
|
||||||
VERSION_PATCH := $(shell cat $(PROJ_ROOT)/CMakeLists.txt | \
|
|
||||||
grep ^set\(VERSION_PATCH\ | sed 's/)/ /' | cut -f2 -d' ')
|
|
||||||
|
|
||||||
################################################################################
|
|
||||||
# toolchain config for arm new processors
|
|
||||||
################################################################################
|
|
||||||
TARGET_HOST = arm-linux
|
|
||||||
TARGET_ABI = armeabi-v7a
|
|
||||||
TARGET_LIBDIR = armeabi-v7a
|
|
||||||
TARGET_TOOLCHAIN = arm-linux-androideabi-
|
|
||||||
TARGET_CFLAGS_ADDON = -mfloat-abi=softfp -mfpu=vfpv3 -O3
|
|
||||||
TARGET_CXXFLAGS_ADDON = $(TARGET_CFLAGS_ADDON)
|
|
||||||
TARGET_ARCH = armv7
|
|
||||||
CROSS_CC = clang
|
|
||||||
CROSS_CXX = clang++
|
|
||||||
COMPILER_VERSION = clang
|
|
||||||
HAVE_LEVELDB = 0
|
|
||||||
|
|
||||||
################################################################################
|
|
||||||
# toolchain config for little endian mips
|
|
||||||
################################################################################
|
|
||||||
#TARGET_HOST = mipsel-linux
|
|
||||||
#TARGET_ABI = mips
|
|
||||||
#TARGET_LIBDIR = mips
|
|
||||||
#TARGET_TOOLCHAIN = mipsel-linux-android-
|
|
||||||
#TARGET_ARCH = mips32
|
|
||||||
#CROSS_CC = mipsel-linux-android-gcc
|
|
||||||
#CROSS_CXX = mipsel-linux-android-g++
|
|
||||||
#COMPILER_VERSION = 4.9
|
|
||||||
#HAVE_LEVELDB = 0
|
|
||||||
|
|
||||||
################################################################################
|
|
||||||
# toolchain config for x86
|
|
||||||
################################################################################
|
|
||||||
#TARGET_HOST = x86-linux
|
|
||||||
#TARGET_ABI = x86
|
|
||||||
#TARGET_LIBDIR = x86
|
|
||||||
#TARGET_TOOLCHAIN = x86-
|
|
||||||
#TARGET_ARCH = x86
|
|
||||||
#CROSS_CC = clang
|
|
||||||
#CROSS_CXX = clang++
|
|
||||||
#COMPILER_VERSION = clang
|
|
||||||
#HAVE_LEVELDB = 0
|
|
||||||
|
|
||||||
################################################################################
|
|
||||||
ASSETS_TIMESTAMP = deps/assets_timestamp
|
|
||||||
|
|
||||||
LEVELDB_DIR = $(ANDR_ROOT)/deps/leveldb/
|
|
||||||
LEVELDB_LIB = $(LEVELDB_DIR)libleveldb.a
|
|
||||||
LEVELDB_TIMESTAMP = $(LEVELDB_DIR)/timestamp
|
|
||||||
LEVELDB_TIMESTAMP_INT = $(ANDR_ROOT)/deps/leveldb_timestamp
|
|
||||||
LEVELDB_URL_GIT = https://github.com/google/leveldb
|
|
||||||
LEVELDB_COMMIT = 2d0320a458d0e6a20fff46d5f80b18bfdcce7018
|
|
||||||
|
|
||||||
OPENAL_DIR = $(ANDR_ROOT)/deps/openal-soft/
|
|
||||||
OPENAL_LIB = $(OPENAL_DIR)libs/$(TARGET_ABI)/libopenal.so
|
|
||||||
OPENAL_TIMESTAMP = $(OPENAL_DIR)/timestamp
|
|
||||||
OPENAL_TIMESTAMP_INT = $(ANDR_ROOT)/deps/openal_timestamp
|
|
||||||
OPENAL_URL_GIT = https://github.com/apportable/openal-soft
|
|
||||||
|
|
||||||
OGG_DIR = $(ANDR_ROOT)/deps/libvorbis-libogg-android/
|
|
||||||
OGG_LIB = $(OGG_DIR)libs/$(TARGET_ABI)/libogg.so
|
|
||||||
VORBIS_LIB = $(OGG_DIR)libs/$(TARGET_ABI)/libogg.so
|
|
||||||
OGG_TIMESTAMP = $(OGG_DIR)timestamp
|
|
||||||
OGG_TIMESTAMP_INT = $(ANDR_ROOT)/deps/ogg_timestamp
|
|
||||||
OGG_URL_GIT = https://gitlab.com/minetest/libvorbis-libogg-android
|
|
||||||
|
|
||||||
IRRLICHT_REVISION = 5150
|
|
||||||
IRRLICHT_DIR = $(ANDR_ROOT)/deps/irrlicht/
|
|
||||||
IRRLICHT_LIB = $(IRRLICHT_DIR)lib/Android/libIrrlicht.a
|
|
||||||
IRRLICHT_TIMESTAMP = $(IRRLICHT_DIR)timestamp
|
|
||||||
IRRLICHT_TIMESTAMP_INT = $(ANDR_ROOT)/deps/irrlicht_timestamp
|
|
||||||
IRRLICHT_URL_SVN = https://svn.code.sf.net/p/irrlicht/code/branches/ogl-es@$(IRRLICHT_REVISION)
|
|
||||||
|
|
||||||
OPENSSL_VERSION = 1.0.2n
|
|
||||||
OPENSSL_BASEDIR = openssl-$(OPENSSL_VERSION)
|
|
||||||
OPENSSL_DIR = $(ANDR_ROOT)/deps/$(OPENSSL_BASEDIR)/
|
|
||||||
OPENSSL_LIB = $(OPENSSL_DIR)/libssl.a
|
|
||||||
OPENSSL_TIMESTAMP = $(OPENSSL_DIR)timestamp
|
|
||||||
OPENSSL_TIMESTAMP_INT = $(ANDR_ROOT)/deps/openssl_timestamp
|
|
||||||
OPENSSL_URL = https://www.openssl.org/source/openssl-$(OPENSSL_VERSION).tar.gz
|
|
||||||
|
|
||||||
CURL_VERSION = 7.60.0
|
|
||||||
CURL_DIR = $(ANDR_ROOT)/deps/curl-$(CURL_VERSION)
|
|
||||||
CURL_LIB = $(CURL_DIR)/lib/.libs/libcurl.a
|
|
||||||
CURL_TIMESTAMP = $(CURL_DIR)/timestamp
|
|
||||||
CURL_TIMESTAMP_INT = $(ANDR_ROOT)/deps/curl_timestamp
|
|
||||||
CURL_URL_HTTP = https://curl.haxx.se/download/curl-${CURL_VERSION}.tar.bz2
|
|
||||||
|
|
||||||
FREETYPE_DIR = $(ANDR_ROOT)/deps/freetype2-android/
|
|
||||||
FREETYPE_LIB = $(FREETYPE_DIR)/Android/obj/local/$(TARGET_ABI)/libfreetype2-static.a
|
|
||||||
FREETYPE_TIMESTAMP = $(FREETYPE_DIR)timestamp
|
|
||||||
FREETYPE_TIMESTAMP_INT = $(ANDR_ROOT)/deps/freetype_timestamp
|
|
||||||
FREETYPE_URL_GIT = https://github.com/cdave1/freetype2-android
|
|
||||||
|
|
||||||
ICONV_VERSION = 1.16
|
|
||||||
ICONV_DIR = $(ANDR_ROOT)/deps/libiconv/
|
|
||||||
ICONV_LIB = $(ICONV_DIR)/lib/.libs/libiconv.so
|
|
||||||
ICONV_TIMESTAMP = $(ICONV_DIR)timestamp
|
|
||||||
ICONV_TIMESTAMP_INT = $(ANDR_ROOT)/deps/iconv_timestamp
|
|
||||||
ICONV_URL_HTTP = https://ftp.gnu.org/pub/gnu/libiconv/libiconv-$(ICONV_VERSION).tar.gz
|
|
||||||
|
|
||||||
SQLITE3_FOLDER = sqlite-amalgamation-3240000
|
|
||||||
SQLITE3_URL = https://www.sqlite.org/2018/$(SQLITE3_FOLDER).zip
|
|
||||||
|
|
||||||
ANDROID_SDK = $(shell grep '^sdk\.dir' local.properties | sed 's/^.*=[[:space:]]*//')
|
|
||||||
ANDROID_NDK = $(shell grep '^ndk\.dir' local.properties | sed 's/^.*=[[:space:]]*//')
|
|
||||||
|
|
||||||
#use interim target variable to switch leveldb on or off
|
|
||||||
ifeq ($(HAVE_LEVELDB),1)
|
|
||||||
LEVELDB_TARGET = $(LEVELDB_LIB)
|
|
||||||
endif
|
|
||||||
|
|
||||||
.PHONY : debug release reconfig delconfig \
|
|
||||||
leveldb_download clean_leveldb leveldb\
|
|
||||||
irrlicht_download clean_irrlicht irrlicht \
|
|
||||||
clean_assets assets sqlite3_download \
|
|
||||||
freetype_download clean_freetype freetype \
|
|
||||||
apk clean_apk \
|
|
||||||
clean_all clean prep_srcdir \
|
|
||||||
install_debug install_release envpaths all \
|
|
||||||
$(ASSETS_TIMESTAMP) $(LEVELDB_TIMESTAMP) \
|
|
||||||
$(OPENAL_TIMESTAMP) $(OGG_TIMESTAMP) \
|
|
||||||
$(IRRLICHT_TIMESTAMP) $(CURL_TIMESTAMP) \
|
|
||||||
$(OPENSSL_TIMESTAMP) \
|
|
||||||
$(ANDR_ROOT)/jni/src/android_version.h \
|
|
||||||
$(ANDR_ROOT)/jni/src/android_version_githash.h
|
|
||||||
|
|
||||||
debug : local.properties
|
|
||||||
export NDEBUG=; \
|
|
||||||
export BUILD_TYPE=debug; \
|
|
||||||
$(MAKE) apk
|
|
||||||
|
|
||||||
all : debug release
|
|
||||||
|
|
||||||
release : local.properties
|
|
||||||
@export NDEBUG=1; \
|
|
||||||
export BUILD_TYPE=release; \
|
|
||||||
$(MAKE) apk
|
|
||||||
|
|
||||||
reconfig: delconfig
|
|
||||||
@$(MAKE) local.properties
|
|
||||||
|
|
||||||
delconfig:
|
|
||||||
$(RM) local.properties
|
|
||||||
|
|
||||||
local.properties:
|
|
||||||
@echo "Please specify path of ANDROID NDK"; \
|
|
||||||
echo "e.g. $$HOME/Android/Sdk/ndk-bundle/"; \
|
|
||||||
read ANDROID_NDK ; \
|
|
||||||
if [ ! -d $$ANDROID_NDK ] ; then \
|
|
||||||
echo "$$ANDROID_NDK is not a valid folder"; \
|
|
||||||
exit 1; \
|
|
||||||
fi; \
|
|
||||||
echo "ndk.dir = $$ANDROID_NDK" > local.properties; \
|
|
||||||
echo "Please specify path of ANDROID SDK"; \
|
|
||||||
echo "e.g. $$HOME/Android/Sdk/"; \
|
|
||||||
read SDKFLDR ; \
|
|
||||||
if [ ! -d $$SDKFLDR ] ; then \
|
|
||||||
echo "$$SDKFLDR is not a valid folder"; \
|
|
||||||
exit 1; \
|
|
||||||
fi; \
|
|
||||||
echo "sdk.dir = $$SDKFLDR" >> local.properties;
|
|
||||||
|
|
||||||
|
|
||||||
$(OPENAL_TIMESTAMP) : openal_download
|
|
||||||
@LAST_MODIF=$$(find ${OPENAL_DIR} -type f -printf '%T@ %p\n' | sort -n | tail -1 | cut -f2- -d" "); \
|
|
||||||
if [ $$(basename $$LAST_MODIF) != "timestamp" ] ; then \
|
|
||||||
touch ${OPENAL_TIMESTAMP}; \
|
|
||||||
fi
|
|
||||||
|
|
||||||
openal_download :
|
|
||||||
@if [ ! -d ${OPENAL_DIR} ] ; then \
|
|
||||||
echo "openal sources missing, downloading..."; \
|
|
||||||
mkdir -p ${ANDR_ROOT}/deps; \
|
|
||||||
cd ${ANDR_ROOT}/deps ; \
|
|
||||||
git clone ${OPENAL_URL_GIT} || exit 1; \
|
|
||||||
fi
|
|
||||||
|
|
||||||
openal : $(OPENAL_LIB)
|
|
||||||
|
|
||||||
$(OPENAL_LIB): $(OPENAL_TIMESTAMP)
|
|
||||||
+ @REFRESH=0; \
|
|
||||||
if [ ! -e ${OPENAL_TIMESTAMP_INT} ] ; then \
|
|
||||||
REFRESH=1; \
|
|
||||||
fi; \
|
|
||||||
if [ ${OPENAL_TIMESTAMP} -nt ${OPENAL_TIMESTAMP_INT} ] ; then \
|
|
||||||
REFRESH=1; \
|
|
||||||
fi; \
|
|
||||||
if [ $$REFRESH -ne 0 ] ; then \
|
|
||||||
echo "changed timestamp for openal detected building..."; \
|
|
||||||
cd ${OPENAL_DIR}; \
|
|
||||||
export APP_PLATFORM=${APP_PLATFORM}; \
|
|
||||||
export TARGET_ABI=${TARGET_ABI}; \
|
|
||||||
export TARGET_CFLAGS_ADDON="${TARGET_CFLAGS_ADDON}"; \
|
|
||||||
export TARGET_CXXFLAGS_ADDON="${TARGET_CXXFLAGS_ADDON}"; \
|
|
||||||
export COMPILER_VERSION=${COMPILER_VERSION}; \
|
|
||||||
${ANDROID_NDK}/ndk-build \
|
|
||||||
NDK_APPLICATION_MK=${ANDR_ROOT}/jni/Deps.mk || exit 1; \
|
|
||||||
touch ${OPENAL_TIMESTAMP}; \
|
|
||||||
touch ${OPENAL_TIMESTAMP_INT}; \
|
|
||||||
else \
|
|
||||||
echo "nothing to be done for openal"; \
|
|
||||||
fi
|
|
||||||
|
|
||||||
clean_openal :
|
|
||||||
$(RM) -rf ${OPENAL_DIR}
|
|
||||||
|
|
||||||
$(OGG_TIMESTAMP) : ogg_download
|
|
||||||
@LAST_MODIF=$$(find ${OGG_DIR} -type f -printf '%T@ %p\n' | sort -n | tail -1 | cut -f2- -d" "); \
|
|
||||||
if [ $$(basename $$LAST_MODIF) != "timestamp" ] ; then \
|
|
||||||
touch ${OGG_TIMESTAMP}; \
|
|
||||||
fi
|
|
||||||
|
|
||||||
ogg_download :
|
|
||||||
@if [ ! -d ${OGG_DIR} ] ; then \
|
|
||||||
echo "ogg sources missing, downloading..."; \
|
|
||||||
mkdir -p ${ANDR_ROOT}/deps; \
|
|
||||||
cd ${ANDR_ROOT}/deps ; \
|
|
||||||
git clone ${OGG_URL_GIT}|| exit 1; \
|
|
||||||
cd libvorbis-libogg-android ; \
|
|
||||||
patch -p1 < ${ANDR_ROOT}/patches/libvorbis-libogg-fpu.patch || exit 1; \
|
|
||||||
fi
|
|
||||||
|
|
||||||
ogg : $(OGG_LIB)
|
|
||||||
|
|
||||||
$(OGG_LIB): $(OGG_TIMESTAMP)
|
|
||||||
+ @REFRESH=0; \
|
|
||||||
if [ ! -e ${OGG_TIMESTAMP_INT} ] ; then \
|
|
||||||
echo "${OGG_TIMESTAMP_INT} doesn't exist"; \
|
|
||||||
REFRESH=1; \
|
|
||||||
fi; \
|
|
||||||
if [ ${OGG_TIMESTAMP} -nt ${OGG_TIMESTAMP_INT} ] ; then \
|
|
||||||
REFRESH=1; \
|
|
||||||
fi; \
|
|
||||||
if [ $$REFRESH -ne 0 ] ; then \
|
|
||||||
echo "changed timestamp for ogg detected building..."; \
|
|
||||||
cd ${OGG_DIR}; \
|
|
||||||
export APP_PLATFORM=${APP_PLATFORM}; \
|
|
||||||
export TARGET_ABI=${TARGET_ABI}; \
|
|
||||||
${ANDROID_NDK}/build/tools/make-standalone-toolchain.sh \
|
|
||||||
--toolchain=${TARGET_TOOLCHAIN}${COMPILER_VERSION} \
|
|
||||||
--platform=${APP_PLATFORM} \
|
|
||||||
--install-dir=$${TOOLCHAIN}; \
|
|
||||||
touch ${OGG_TIMESTAMP}; \
|
|
||||||
touch ${OGG_TIMESTAMP_INT}; \
|
|
||||||
else \
|
|
||||||
echo "nothing to be done for libogg/libvorbis"; \
|
|
||||||
fi
|
|
||||||
|
|
||||||
clean_ogg :
|
|
||||||
$(RM) -rf ${OGG_DIR}
|
|
||||||
|
|
||||||
$(OPENSSL_TIMESTAMP) : openssl_download
|
|
||||||
@LAST_MODIF=$$(find ${OPENSSL_DIR} -type f -printf '%T@ %p\n' | sort -n | tail -1 | cut -f2- -d" "); \
|
|
||||||
if [ $$(basename $$LAST_MODIF) != "timestamp" ] ; then \
|
|
||||||
touch ${OPENSSL_TIMESTAMP}; \
|
|
||||||
fi
|
|
||||||
|
|
||||||
openssl_download :
|
|
||||||
@if [ ! -d ${OPENSSL_DIR} ] ; then \
|
|
||||||
echo "openssl sources missing, downloading..."; \
|
|
||||||
mkdir -p ${ANDR_ROOT}/deps; \
|
|
||||||
cd ${ANDR_ROOT}/deps ; \
|
|
||||||
wget ${OPENSSL_URL} || exit 1; \
|
|
||||||
tar -xzf ${OPENSSL_BASEDIR}.tar.gz; \
|
|
||||||
cd ${OPENSSL_BASEDIR}; \
|
|
||||||
patch -p1 < ${ANDR_ROOT}/patches/openssl_arch.patch; \
|
|
||||||
sed -i 's/-mandroid //g' Configure; \
|
|
||||||
fi
|
|
||||||
|
|
||||||
openssl : $(OPENSSL_LIB)
|
|
||||||
|
|
||||||
$(OPENSSL_LIB): $(OPENSSL_TIMESTAMP)
|
|
||||||
@REFRESH=0; \
|
|
||||||
if [ ! -e ${OPENSSL_TIMESTAMP_INT} ] ; then \
|
|
||||||
echo "${OPENSSL_TIMESTAMP_INT} doesn't exist"; \
|
|
||||||
REFRESH=1; \
|
|
||||||
fi; \
|
|
||||||
if [ ${OPENSSL_TIMESTAMP} -nt ${OPENSSL_TIMESTAMP_INT} ] ; then \
|
|
||||||
REFRESH=1; \
|
|
||||||
fi; \
|
|
||||||
if [ $$REFRESH -ne 0 ] ; then \
|
|
||||||
echo "changed timestamp for openssl detected building..."; \
|
|
||||||
cd ${OPENSSL_DIR}; \
|
|
||||||
ln -s ${OPENSSL_DIR} ../openssl; \
|
|
||||||
export TOOLCHAIN=/tmp/ndk-${TARGET_HOST}-openssl; \
|
|
||||||
${ANDROID_NDK}/build/tools/make-standalone-toolchain.sh \
|
|
||||||
--toolchain=${TARGET_TOOLCHAIN}${COMPILER_VERSION} \
|
|
||||||
--platform=${APP_PLATFORM} \
|
|
||||||
--stl=libc++ \
|
|
||||||
--install-dir=$${TOOLCHAIN}; \
|
|
||||||
export PATH="$${TOOLCHAIN}/bin:$${PATH}"; \
|
|
||||||
export CFLAGS="$${CFLAGS} ${TARGET_CFLAGS_ADDON}"; \
|
|
||||||
export LDFLAGS="$${LDFLAGS} ${TARGET_LDFLAGS_ADDON}"; \
|
|
||||||
CC=${CROSS_CC} ./Configure -DL_ENDIAN no-asm android-${TARGET_ARCH} \
|
|
||||||
-D__ANDROID_API__=$(API); \
|
|
||||||
CC=${CROSS_CC} ANDROID_DEV=/tmp/ndk-${TARGET_HOST} make depend; \
|
|
||||||
CC=${CROSS_CC} ANDROID_DEV=/tmp/ndk-${TARGET_HOST} make build_libs; \
|
|
||||||
touch ${OPENSSL_TIMESTAMP}; \
|
|
||||||
touch ${OPENSSL_TIMESTAMP_INT}; \
|
|
||||||
$(RM) -rf $${TOOLCHAIN}; \
|
|
||||||
else \
|
|
||||||
echo "nothing to be done for openssl"; \
|
|
||||||
fi
|
|
||||||
|
|
||||||
clean_openssl :
|
|
||||||
$(RM) -rf ${OPENSSL_DIR}; \
|
|
||||||
$(RM) -rf $(ANDR_ROOT)/deps/${OPENSSL_BASEDIR}.tar.gz; \
|
|
||||||
$(RM) -rf $(ANDR_ROOT)/deps/openssl
|
|
||||||
|
|
||||||
$(LEVELDB_TIMESTAMP) : leveldb_download
|
|
||||||
@LAST_MODIF=$$(find ${LEVELDB_DIR} -type f -printf '%T@ %p\n' | sort -n | tail -1 | cut -f2- -d" "); \
|
|
||||||
if [ $$(basename $$LAST_MODIF) != "timestamp" ] ; then \
|
|
||||||
touch ${LEVELDB_TIMESTAMP}; \
|
|
||||||
fi
|
|
||||||
|
|
||||||
leveldb_download :
|
|
||||||
@if [ ! -d ${LEVELDB_DIR} ] ; then \
|
|
||||||
echo "leveldb sources missing, downloading..."; \
|
|
||||||
mkdir -p ${ANDR_ROOT}/deps; \
|
|
||||||
cd ${ANDR_ROOT}/deps ; \
|
|
||||||
git clone ${LEVELDB_URL_GIT} || exit 1; \
|
|
||||||
cd ${LEVELDB_DIR} || exit 1; \
|
|
||||||
git checkout ${LEVELDB_COMMIT} || exit 1; \
|
|
||||||
fi
|
|
||||||
|
|
||||||
leveldb : $(LEVELDB_LIB)
|
|
||||||
ifeq ($(HAVE_LEVELDB),1)
|
|
||||||
$(LEVELDB_LIB): $(LEVELDB_TIMESTAMP)
|
|
||||||
@REFRESH=0; \
|
|
||||||
if [ ! -e ${LEVELDB_TIMESTAMP_INT} ] ; then \
|
|
||||||
REFRESH=1; \
|
|
||||||
fi; \
|
|
||||||
if [ ${LEVELDB_TIMESTAMP} -nt ${LEVELDB_TIMESTAMP_INT} ] ; then \
|
|
||||||
REFRESH=1; \
|
|
||||||
fi; \
|
|
||||||
if [ $$REFRESH -ne 0 ] ; then \
|
|
||||||
echo "changed timestamp for leveldb detected building..."; \
|
|
||||||
cd deps/leveldb; \
|
|
||||||
export CROSS_PREFIX=${TARGET_TOOLCHAIN}; \
|
|
||||||
export TOOLCHAIN=/tmp/ndk-${TARGET_HOST}-leveldb; \
|
|
||||||
${ANDROID_NDK}/build/tools/make-standalone-toolchain.sh \
|
|
||||||
--toolchain=${TARGET_TOOLCHAIN}${COMPILER_VERSION} \
|
|
||||||
--platform=${APP_PLATFORM} \
|
|
||||||
--stl=libc++ \
|
|
||||||
--install-dir=$${TOOLCHAIN}; \
|
|
||||||
export PATH="$${TOOLCHAIN}/bin:$${PATH}"; \
|
|
||||||
export CC=${CROSS_CC}; \
|
|
||||||
export CXX=${CROSS_CXX}; \
|
|
||||||
export CFLAGS="$${CFLAGS} ${TARGET_CFLAGS_ADDON}"; \
|
|
||||||
export CPPFLAGS="$${CPPFLAGS} ${TARGET_CXXFLAGS_ADDON}"; \
|
|
||||||
export LDFLAGS="$${LDFLAGS} ${TARGET_LDFLAGS_ADDON}"; \
|
|
||||||
export TARGET_OS=OS_ANDROID_CROSSCOMPILE; \
|
|
||||||
$(MAKE) || exit 1; \
|
|
||||||
touch ${LEVELDB_TIMESTAMP}; \
|
|
||||||
touch ${LEVELDB_TIMESTAMP_INT}; \
|
|
||||||
$(RM) -rf $${TOOLCHAIN}; \
|
|
||||||
else \
|
|
||||||
echo "nothing to be done for leveldb"; \
|
|
||||||
fi
|
|
||||||
endif
|
|
||||||
|
|
||||||
clean_leveldb :
|
|
||||||
./gradlew cleanLevelDB
|
|
||||||
|
|
||||||
$(FREETYPE_TIMESTAMP) : freetype_download
|
|
||||||
@LAST_MODIF=$$(find ${FREETYPE_DIR} -type f -printf '%T@ %p\n' | sort -n | tail -1 | cut -f2- -d" "); \
|
|
||||||
if [ $$(basename $$LAST_MODIF) != "timestamp" ] ; then \
|
|
||||||
touch ${FREETYPE_TIMESTAMP}; \
|
|
||||||
fi
|
|
||||||
|
|
||||||
freetype_download :
|
|
||||||
@if [ ! -d ${FREETYPE_DIR} ] ; then \
|
|
||||||
echo "freetype sources missing, downloading..."; \
|
|
||||||
mkdir -p ${ANDR_ROOT}/deps; \
|
|
||||||
cd deps; \
|
|
||||||
git clone ${FREETYPE_URL_GIT} || exit 1; \
|
|
||||||
fi
|
|
||||||
|
|
||||||
freetype : $(FREETYPE_LIB)
|
|
||||||
|
|
||||||
$(FREETYPE_LIB) : $(FREETYPE_TIMESTAMP)
|
|
||||||
+ @REFRESH=0; \
|
|
||||||
if [ ! -e ${FREETYPE_TIMESTAMP_INT} ] ; then \
|
|
||||||
REFRESH=1; \
|
|
||||||
fi; \
|
|
||||||
if [ ! -e ${FREETYPE_LIB} ] ; then \
|
|
||||||
REFRESH=1; \
|
|
||||||
fi; \
|
|
||||||
if [ ${FREETYPE_TIMESTAMP} -nt ${FREETYPE_TIMESTAMP_INT} ] ; then \
|
|
||||||
REFRESH=1; \
|
|
||||||
fi; \
|
|
||||||
if [ $$REFRESH -ne 0 ] ; then \
|
|
||||||
mkdir -p ${FREETYPE_DIR}; \
|
|
||||||
echo "changed timestamp for freetype detected building..."; \
|
|
||||||
cd ${FREETYPE_DIR}/Android/jni; \
|
|
||||||
export APP_PLATFORM=${APP_PLATFORM}; \
|
|
||||||
export TARGET_ABI=${TARGET_ABI}; \
|
|
||||||
export TARGET_CFLAGS_ADDON="${TARGET_CFLAGS_ADDON}"; \
|
|
||||||
export TARGET_CXXFLAGS_ADDON="${TARGET_CXXFLAGS_ADDON}"; \
|
|
||||||
export COMPILER_VERSION=${COMPILER_VERSION}; \
|
|
||||||
${ANDROID_NDK}/ndk-build \
|
|
||||||
NDK_APPLICATION_MK=${ANDR_ROOT}/jni/Deps.mk || exit 1; \
|
|
||||||
touch ${FREETYPE_TIMESTAMP}; \
|
|
||||||
touch ${FREETYPE_TIMESTAMP_INT}; \
|
|
||||||
else \
|
|
||||||
echo "nothing to be done for freetype"; \
|
|
||||||
fi
|
|
||||||
|
|
||||||
clean_freetype :
|
|
||||||
./gradlew cleanFreetype
|
|
||||||
|
|
||||||
$(ICONV_TIMESTAMP) : iconv_download
|
|
||||||
@LAST_MODIF=$$(find ${ICONV_DIR} -type f -printf '%T@ %p\n' | sort -n | tail -1 | cut -f2- -d" "); \
|
|
||||||
if [ $$(basename $$LAST_MODIF) != "timestamp" ] ; then \
|
|
||||||
touch ${ICONV_TIMESTAMP}; \
|
|
||||||
fi
|
|
||||||
|
|
||||||
iconv_download :
|
|
||||||
@if [ ! -d ${ICONV_DIR} ] ; then \
|
|
||||||
echo "iconv sources missing, downloading..."; \
|
|
||||||
mkdir -p ${ANDR_ROOT}/deps; \
|
|
||||||
cd ${ANDR_ROOT}/deps; \
|
|
||||||
wget ${ICONV_URL_HTTP} || exit 1; \
|
|
||||||
tar -xzf libiconv-${ICONV_VERSION}.tar.gz || exit 1; \
|
|
||||||
rm libiconv-${ICONV_VERSION}.tar.gz; \
|
|
||||||
ln -s libiconv-${ICONV_VERSION} libiconv; \
|
|
||||||
fi
|
|
||||||
|
|
||||||
iconv : $(ICONV_LIB)
|
|
||||||
|
|
||||||
$(ICONV_LIB) : $(ICONV_TIMESTAMP)
|
|
||||||
@REFRESH=0; \
|
|
||||||
if [ ! -e ${ICONV_TIMESTAMP_INT} ] ; then \
|
|
||||||
REFRESH=1; \
|
|
||||||
fi; \
|
|
||||||
if [ ! -e ${ICONV_LIB} ] ; then \
|
|
||||||
REFRESH=1; \
|
|
||||||
fi; \
|
|
||||||
if [ ${ICONV_TIMESTAMP} -nt ${ICONV_TIMESTAMP_INT} ] ; then \
|
|
||||||
REFRESH=1; \
|
|
||||||
fi; \
|
|
||||||
if [ $$REFRESH -ne 0 ] ; then \
|
|
||||||
mkdir -p ${ICONV_DIR}; \
|
|
||||||
echo "changed timestamp for iconv detected building..."; \
|
|
||||||
cd ${ICONV_DIR}; \
|
|
||||||
export TOOLCHAIN=/tmp/ndk-${TARGET_HOST}-iconv; \
|
|
||||||
${ANDROID_NDK}/build/tools/make-standalone-toolchain.sh \
|
|
||||||
--toolchain=${TARGET_TOOLCHAIN}${COMPILER_VERSION} \
|
|
||||||
--platform=${APP_PLATFORM} \
|
|
||||||
--stl=libc++ \
|
|
||||||
--install-dir=$${TOOLCHAIN}; \
|
|
||||||
export PATH="$${TOOLCHAIN}/bin:$${PATH}"; \
|
|
||||||
export CFLAGS="$${CFLAGS} ${TARGET_CFLAGS_ADDON}"; \
|
|
||||||
export LDFLAGS="$${LDFLAGS} ${TARGET_LDFLAGS_ADDON} -lstdc++"; \
|
|
||||||
export CC=${CROSS_CC}; \
|
|
||||||
export CXX=${CROSS_CXX}; \
|
|
||||||
export TARGET_OS=OS_ANDROID_CROSSCOMPILE; \
|
|
||||||
./configure --host=${TARGET_HOST} || exit 1; \
|
|
||||||
sed -i 's/LIBICONV_VERSION_INFO) /LIBICONV_VERSION_INFO) -avoid-version /g' lib/Makefile; \
|
|
||||||
grep "iconv_LDFLAGS" src/Makefile; \
|
|
||||||
$(MAKE) -s || exit 1; \
|
|
||||||
touch ${ICONV_TIMESTAMP}; \
|
|
||||||
touch ${ICONV_TIMESTAMP_INT}; \
|
|
||||||
rm -rf ${TOOLCHAIN}; \
|
|
||||||
else \
|
|
||||||
echo "nothing to be done for iconv"; \
|
|
||||||
fi
|
|
||||||
|
|
||||||
clean_iconv :
|
|
||||||
./gradlew cleanIconv
|
|
||||||
|
|
||||||
#Note: Texturehack patch is required for gpu's not supporting color format
|
|
||||||
# correctly. Known bad GPU:
|
|
||||||
# -geforce on emulator
|
|
||||||
# -Vivante Corporation GC1000 core (e.g. Galaxy Tab 3)
|
|
||||||
|
|
||||||
irrlicht_download :
|
|
||||||
@if [ ! -d "deps/irrlicht" ] ; then \
|
|
||||||
echo "irrlicht sources missing, downloading..."; \
|
|
||||||
mkdir -p ${ANDR_ROOT}/deps; \
|
|
||||||
cd deps; \
|
|
||||||
svn co ${IRRLICHT_URL_SVN} irrlicht || exit 1; \
|
|
||||||
cd irrlicht; \
|
|
||||||
patch -p1 < ${ANDR_ROOT}/patches/irrlicht-touchcount.patch || exit 1; \
|
|
||||||
patch -p1 < ${ANDR_ROOT}/patches/irrlicht-back_button.patch || exit 1; \
|
|
||||||
patch -p1 < ${ANDR_ROOT}/patches/irrlicht-texturehack.patch || exit 1; \
|
|
||||||
patch -p1 < ${ANDR_ROOT}/patches/irrlicht-native_activity.patch || exit 1; \
|
|
||||||
fi
|
|
||||||
|
|
||||||
$(IRRLICHT_TIMESTAMP) : irrlicht_download
|
|
||||||
@LAST_MODIF=$$(find ${IRRLICHT_DIR} -type f -printf '%T@ %p\n' | sort -n | tail -1 | cut -f2- -d" "); \
|
|
||||||
if [ $$(basename $$LAST_MODIF) != "timestamp" ] ; then \
|
|
||||||
touch ${IRRLICHT_TIMESTAMP}; \
|
|
||||||
fi
|
|
||||||
|
|
||||||
irrlicht : $(IRRLICHT_LIB)
|
|
||||||
|
|
||||||
$(IRRLICHT_LIB): $(IRRLICHT_TIMESTAMP) $(FREETYPE_LIB)
|
|
||||||
+ @REFRESH=0; \
|
|
||||||
if [ ! -e ${IRRLICHT_TIMESTAMP_INT} ] ; then \
|
|
||||||
REFRESH=1; \
|
|
||||||
fi; \
|
|
||||||
if [ ! -e ${IRRLICHT_LIB} ] ; then \
|
|
||||||
REFRESH=1; \
|
|
||||||
fi; \
|
|
||||||
if [ ${IRRLICHT_TIMESTAMP} -nt ${IRRLICHT_TIMESTAMP_INT} ] ; then \
|
|
||||||
REFRESH=1; \
|
|
||||||
fi; \
|
|
||||||
if [ $$REFRESH -ne 0 ] ; then \
|
|
||||||
mkdir -p ${IRRLICHT_DIR}; \
|
|
||||||
echo "changed timestamp for irrlicht detected building..."; \
|
|
||||||
cd deps/irrlicht/source/Irrlicht/Android; \
|
|
||||||
export APP_PLATFORM=${APP_PLATFORM}; \
|
|
||||||
export TARGET_ABI=${TARGET_ABI}; \
|
|
||||||
export TARGET_CFLAGS_ADDON="${TARGET_CFLAGS_ADDON}"; \
|
|
||||||
export TARGET_CXXFLAGS_ADDON="${TARGET_CXXFLAGS_ADDON}"; \
|
|
||||||
export COMPILER_VERSION=${COMPILER_VERSION}; \
|
|
||||||
${ANDROID_NDK}/ndk-build \
|
|
||||||
NDK_APPLICATION_MK=${ANDR_ROOT}/jni/Deps.mk || exit 1; \
|
|
||||||
touch ${IRRLICHT_TIMESTAMP}; \
|
|
||||||
touch ${IRRLICHT_TIMESTAMP_INT}; \
|
|
||||||
else \
|
|
||||||
echo "nothing to be done for irrlicht"; \
|
|
||||||
fi
|
|
||||||
|
|
||||||
clean_irrlicht :
|
|
||||||
./gradlew cleanIrrlicht
|
|
||||||
|
|
||||||
$(CURL_TIMESTAMP) : curl_download
|
|
||||||
@LAST_MODIF=$$(find ${CURL_DIR} -type f -printf '%T@ %p\n' | sort -n | tail -1 | cut -f2- -d" "); \
|
|
||||||
if [ $$(basename $$LAST_MODIF) != "timestamp" ] ; then \
|
|
||||||
touch ${CURL_TIMESTAMP}; \
|
|
||||||
fi
|
|
||||||
|
|
||||||
curl_download :
|
|
||||||
@if [ ! -d "deps/curl-${CURL_VERSION}" ] ; then \
|
|
||||||
echo "curl sources missing, downloading..."; \
|
|
||||||
mkdir -p ${ANDR_ROOT}/deps; \
|
|
||||||
cd deps; \
|
|
||||||
wget ${CURL_URL_HTTP} || exit 1; \
|
|
||||||
tar -xjf curl-${CURL_VERSION}.tar.bz2 || exit 1; \
|
|
||||||
rm curl-${CURL_VERSION}.tar.bz2; \
|
|
||||||
ln -s curl-${CURL_VERSION} curl; \
|
|
||||||
fi
|
|
||||||
|
|
||||||
curl : $(CURL_LIB)
|
|
||||||
|
|
||||||
$(CURL_LIB): $(CURL_TIMESTAMP) $(OPENSSL_LIB)
|
|
||||||
@REFRESH=0; \
|
|
||||||
if [ ! -e ${CURL_TIMESTAMP_INT} ] ; then \
|
|
||||||
REFRESH=1; \
|
|
||||||
fi; \
|
|
||||||
if [ ! -e ${CURL_LIB} ] ; then \
|
|
||||||
REFRESH=1; \
|
|
||||||
fi; \
|
|
||||||
if [ ${CURL_TIMESTAMP} -nt ${CURL_TIMESTAMP_INT} ] ; then \
|
|
||||||
REFRESH=1; \
|
|
||||||
fi; \
|
|
||||||
if [ $$REFRESH -ne 0 ] ; then \
|
|
||||||
mkdir -p ${CURL_DIR}; \
|
|
||||||
echo "changed timestamp for curl detected building..."; \
|
|
||||||
cd deps/curl-${CURL_VERSION}; \
|
|
||||||
export CROSS_PREFIX=${TARGET_TOOLCHAIN}; \
|
|
||||||
export TOOLCHAIN=/tmp/ndk-${TARGET_HOST}-curl; \
|
|
||||||
${ANDROID_NDK}/build/tools/make-standalone-toolchain.sh \
|
|
||||||
--toolchain=${TARGET_TOOLCHAIN}${COMPILER_VERSION} \
|
|
||||||
--platform=${APP_PLATFORM} \
|
|
||||||
--stl=libc++ \
|
|
||||||
--install-dir=$${TOOLCHAIN}; \
|
|
||||||
export PATH="$${TOOLCHAIN}/bin:$${PATH}"; \
|
|
||||||
export CC=${CROSS_CC}; \
|
|
||||||
export CXX=${CROSS_CXX}; \
|
|
||||||
export TARGET_OS=OS_ANDROID_CROSSCOMPILE; \
|
|
||||||
export CPPFLAGS="$${CPPFLAGS} -I${OPENSSL_DIR}/include ${TARGET_CFLAGS_ADDON}"; \
|
|
||||||
export CFLAGS="$${CFLAGS} ${TARGET_CFLAGS_ADDON}"; \
|
|
||||||
export LDFLAGS="$${LDFLAGS} -L${OPENSSL_DIR} ${TARGET_LDFLAGS_ADDON}"; \
|
|
||||||
./configure --host=${TARGET_HOST} --disable-shared --enable-static --with-ssl; \
|
|
||||||
$(MAKE) -s || exit 1; \
|
|
||||||
touch ${CURL_TIMESTAMP}; \
|
|
||||||
touch ${CURL_TIMESTAMP_INT}; \
|
|
||||||
$(RM) -rf $${TOOLCHAIN}; \
|
|
||||||
else \
|
|
||||||
echo "nothing to be done for curl"; \
|
|
||||||
fi
|
|
||||||
|
|
||||||
clean_curl :
|
|
||||||
./gradlew cleanCURL
|
|
||||||
|
|
||||||
sqlite3_download: deps/${SQLITE3_FOLDER}/sqlite3.c
|
|
||||||
|
|
||||||
deps/${SQLITE3_FOLDER}/sqlite3.c :
|
|
||||||
cd deps; \
|
|
||||||
wget ${SQLITE3_URL}; \
|
|
||||||
unzip ${SQLITE3_FOLDER}.zip; \
|
|
||||||
ln -s ${SQLITE3_FOLDER} sqlite; \
|
|
||||||
cd ${SQLITE3_FOLDER};
|
|
||||||
|
|
||||||
clean_sqlite3:
|
|
||||||
./gradlew cleanSQLite3
|
|
||||||
|
|
||||||
$(ASSETS_TIMESTAMP) : $(IRRLICHT_LIB)
|
|
||||||
@mkdir -p ${ANDR_ROOT}/deps; \
|
|
||||||
for DIRNAME in {builtin,client,doc,fonts,games,mods,po,textures}; do \
|
|
||||||
LAST_MODIF=$$(find ${PROJ_ROOT}/${DIRNAME} -type f -printf '%T@ %p\n' | sort -n | tail -1 | cut -f2- -d" "); \
|
|
||||||
if [ $$(basename $$LAST_MODIF) != "timestamp" ]; then \
|
|
||||||
touch ${PROJ_ROOT}/${DIRNAME}/timestamp; \
|
|
||||||
touch ${ASSETS_TIMESTAMP}; \
|
|
||||||
echo ${DIRNAME} changed $$LAST_MODIF; \
|
|
||||||
fi; \
|
|
||||||
done; \
|
|
||||||
LAST_MODIF=$$(find ${IRRLICHT_DIR}/media -type f -printf '%T@ %p\n' | sort -n | tail -1 | cut -f2- -d" "); \
|
|
||||||
if [ $$(basename $$LAST_MODIF) != "timestamp" ] ; then \
|
|
||||||
touch ${IRRLICHT_DIR}/media/timestamp; \
|
|
||||||
touch ${ASSETS_TIMESTAMP}; \
|
|
||||||
fi; \
|
|
||||||
if [ ${PROJ_ROOT}/minetest.conf.example -nt ${ASSETS_TIMESTAMP} ] ; then \
|
|
||||||
echo "conf changed"; \
|
|
||||||
touch ${ASSETS_TIMESTAMP}; \
|
|
||||||
fi; \
|
|
||||||
if [ ${PROJ_ROOT}/README.txt -nt ${ASSETS_TIMESTAMP} ] ; then \
|
|
||||||
touch ${ASSETS_TIMESTAMP}; \
|
|
||||||
fi; \
|
|
||||||
if [ ! -e $(ASSETS_TIMESTAMP) ] ; then \
|
|
||||||
touch $(ASSETS_TIMESTAMP); \
|
|
||||||
fi
|
|
||||||
|
|
||||||
assets : $(ASSETS_TIMESTAMP)
|
|
||||||
@REFRESH=0; \
|
|
||||||
if [ ! -e ${ASSETS_TIMESTAMP}.old ] ; then \
|
|
||||||
REFRESH=1; \
|
|
||||||
fi; \
|
|
||||||
if [ ${ASSETS_TIMESTAMP} -nt ${ASSETS_TIMESTAMP}.old ] ; then \
|
|
||||||
REFRESH=1; \
|
|
||||||
fi; \
|
|
||||||
if [ ! -d ${APP_ROOT}/assets ] ; then \
|
|
||||||
REFRESH=1; \
|
|
||||||
fi; \
|
|
||||||
if [ $$REFRESH -ne 0 ] ; then \
|
|
||||||
echo "assets changed, refreshing..."; \
|
|
||||||
$(MAKE) clean_assets; \
|
|
||||||
./gradlew copyAssets; \
|
|
||||||
cp -r ${IRRLICHT_DIR}/media/Shaders ${APP_ROOT}/assets/Minetest/media; \
|
|
||||||
cd ${APP_ROOT}/assets || exit 1; \
|
|
||||||
find . -name "timestamp" -exec rm {} \; ; \
|
|
||||||
find . -name "*.blend" -exec rm {} \; ; \
|
|
||||||
find . -name "*~" -exec rm {} \; ; \
|
|
||||||
find . -type d -path "*.git" -exec rm -rf {} \; ; \
|
|
||||||
find . -type d -path "*.svn" -exec rm -rf {} \; ; \
|
|
||||||
find . -type f -path "*.gitignore" -exec rm -rf {} \; ; \
|
|
||||||
ls -R | grep ":$$" | sed -e 's/:$$//' -e 's/\.//' -e 's/^\///' > "index.txt"; \
|
|
||||||
find -L Minetest > filelist.txt; \
|
|
||||||
cp ${ANDR_ROOT}/${ASSETS_TIMESTAMP} ${ANDR_ROOT}/${ASSETS_TIMESTAMP}.old; \
|
|
||||||
else \
|
|
||||||
echo "nothing to be done for assets"; \
|
|
||||||
fi
|
|
||||||
|
|
||||||
clean_assets :
|
|
||||||
./gradlew cleanAssets
|
|
||||||
|
|
||||||
apk: local.properties assets $(ICONV_LIB) $(IRRLICHT_LIB) $(CURL_LIB) $(LEVELDB_TARGET) \
|
|
||||||
$(OPENAL_LIB) $(OGG_LIB) prep_srcdir $(ANDR_ROOT)/jni/src/android_version.h \
|
|
||||||
$(ANDR_ROOT)/jni/src/android_version_githash.h sqlite3_download
|
|
||||||
+ @export TARGET_LIBDIR=${TARGET_LIBDIR}; \
|
|
||||||
export HAVE_LEVELDB=${HAVE_LEVELDB}; \
|
|
||||||
export APP_PLATFORM=${APP_PLATFORM}; \
|
|
||||||
export TARGET_ABI=${TARGET_ABI}; \
|
|
||||||
export TARGET_CFLAGS_ADDON="${TARGET_CFLAGS_ADDON}"; \
|
|
||||||
export TARGET_CXXFLAGS_ADDON="${TARGET_CXXFLAGS_ADDON}"; \
|
|
||||||
export COMPILER_VERSION=${COMPILER_VERSION}; \
|
|
||||||
export GPROF=${GPROF}; \
|
|
||||||
${ANDROID_NDK}/ndk-build || exit 1; \
|
|
||||||
if [ ! -e ${APP_ROOT}/jniLibs ]; then \
|
|
||||||
ln -s ${ANDR_ROOT}/libs ${APP_ROOT}/jniLibs || exit 1; \
|
|
||||||
fi; \
|
|
||||||
export VERSION_STR="${VERSION_MAJOR}.${VERSION_MINOR}.${VERSION_PATCH}" && \
|
|
||||||
export BUILD_TYPE_C=$$(echo "$${BUILD_TYPE}" | sed 's/./\U&/') && \
|
|
||||||
./gradlew assemble$$BUILD_TYPE_C && \
|
|
||||||
echo "APK stored at: build/outputs/apk/$$BUILD_TYPE/Minetest-$$BUILD_TYPE.apk" && \
|
|
||||||
echo "You can install it with \`make install_$$BUILD_TYPE\`"
|
|
||||||
|
|
||||||
# These Intentionally doesn't depend on their respective build steps,
|
|
||||||
# because it takes a while to verify that everything's up-to-date.
|
|
||||||
install_debug:
|
|
||||||
${ANDROID_SDK}/platform-tools/adb install -r build/outputs/apk/debug/Minetest-debug.apk
|
|
||||||
|
|
||||||
install_release:
|
|
||||||
${ANDROID_SDK}/platform-tools/adb install -r build/outputs/apk/release/Minetest-release.apk
|
|
||||||
|
|
||||||
prep_srcdir :
|
|
||||||
@if [ ! -e ${ANDR_ROOT}/jni/src ]; then \
|
|
||||||
ln -s ${PROJ_ROOT}/src ${ANDR_ROOT}/jni/src; \
|
|
||||||
fi; \
|
|
||||||
if [ ! -e ${ANDR_ROOT}/jni/lib ]; then \
|
|
||||||
ln -s ${PROJ_ROOT}/lib ${ANDR_ROOT}/jni/lib; \
|
|
||||||
fi
|
|
||||||
|
|
||||||
clean_apk :
|
|
||||||
./gradlew clean
|
|
||||||
|
|
||||||
clean_all :
|
|
||||||
./gradlew cleanAll
|
|
||||||
|
|
||||||
$(ANDR_ROOT)/jni/src/android_version_githash.h : prep_srcdir
|
|
||||||
@export VERSION_FILE=${ANDR_ROOT}/jni/src/android_version_githash.h; \
|
|
||||||
export VERSION_FILE_NEW=$${VERSION_FILE}.new; \
|
|
||||||
{ \
|
|
||||||
echo "#ifndef ANDROID_MT_VERSION_GITHASH_H"; \
|
|
||||||
echo "#define ANDROID_MT_VERSION_GITHASH_H"; \
|
|
||||||
export GITHASH=$$(git rev-parse --short=8 HEAD); \
|
|
||||||
export VERSION_STR="${VERSION_MAJOR}.${VERSION_MINOR}.${VERSION_PATCH}"; \
|
|
||||||
echo "#define VERSION_GITHASH \"$$VERSION_STR-$$GITHASH-Android\""; \
|
|
||||||
echo "#endif"; \
|
|
||||||
} > "$${VERSION_FILE_NEW}"; \
|
|
||||||
if ! cmp -s $${VERSION_FILE} $${VERSION_FILE_NEW}; then \
|
|
||||||
echo "android_version_githash.h changed, updating..."; \
|
|
||||||
mv "$${VERSION_FILE_NEW}" "$${VERSION_FILE}"; \
|
|
||||||
else \
|
|
||||||
rm "$${VERSION_FILE_NEW}"; \
|
|
||||||
fi
|
|
||||||
|
|
||||||
|
|
||||||
$(ANDR_ROOT)/jni/src/android_version.h : prep_srcdir
|
|
||||||
@export VERSION_FILE=${ANDR_ROOT}/jni/src/android_version.h; \
|
|
||||||
export VERSION_FILE_NEW=$${VERSION_FILE}.new; \
|
|
||||||
{ \
|
|
||||||
echo "#ifndef ANDROID_MT_VERSION_H"; \
|
|
||||||
echo "#define ANDROID_MT_VERSION_H"; \
|
|
||||||
echo "#define VERSION_MAJOR ${VERSION_MAJOR}"; \
|
|
||||||
echo "#define VERSION_MINOR ${VERSION_MINOR}"; \
|
|
||||||
echo "#define VERSION_PATCH ${VERSION_PATCH}"; \
|
|
||||||
echo "#define VERSION_STRING STR(VERSION_MAJOR) \".\" STR(VERSION_MINOR) \
|
|
||||||
\".\" STR(VERSION_PATCH)"; \
|
|
||||||
echo "#endif"; \
|
|
||||||
} > $${VERSION_FILE_NEW}; \
|
|
||||||
if ! cmp -s $${VERSION_FILE} $${VERSION_FILE_NEW}; then \
|
|
||||||
echo "android_version.h changed, updating..."; \
|
|
||||||
mv "$${VERSION_FILE_NEW}" "$${VERSION_FILE}"; \
|
|
||||||
else \
|
|
||||||
rm "$${VERSION_FILE_NEW}"; \
|
|
||||||
fi
|
|
||||||
|
|
||||||
clean : clean_apk clean_assets
|
|
108
build/android/app/build.gradle
Normal file
108
build/android/app/build.gradle
Normal file
@ -0,0 +1,108 @@
|
|||||||
|
apply plugin: 'com.android.application'
|
||||||
|
android {
|
||||||
|
compileSdkVersion 29
|
||||||
|
buildToolsVersion '29.0.3'
|
||||||
|
ndkVersion '21.0.6113669'
|
||||||
|
defaultConfig {
|
||||||
|
applicationId 'net.minetest.minetest'
|
||||||
|
minSdkVersion 16
|
||||||
|
//noinspection OldTargetApi
|
||||||
|
targetSdkVersion 28 // Workaround for using `/sdcard` instead of the `data` patch for assets
|
||||||
|
versionName "${versionMajor}.${versionMinor}.${versionPatch}"
|
||||||
|
versionCode project.versionCode
|
||||||
|
}
|
||||||
|
|
||||||
|
Properties props = new Properties()
|
||||||
|
props.load(new FileInputStream(file('../local.properties')))
|
||||||
|
|
||||||
|
if (props.getProperty('keystore') != null) {
|
||||||
|
signingConfigs {
|
||||||
|
release {
|
||||||
|
storeFile file(props['keystore'])
|
||||||
|
storePassword props['keystore.password']
|
||||||
|
keyAlias props['key']
|
||||||
|
keyPassword props['key.password']
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
buildTypes {
|
||||||
|
release {
|
||||||
|
minifyEnabled true
|
||||||
|
signingConfig signingConfigs.release
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// for multiple APKs
|
||||||
|
splits {
|
||||||
|
abi {
|
||||||
|
enable true
|
||||||
|
reset()
|
||||||
|
include 'armeabi-v7a', 'arm64-v8a'
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
compileOptions {
|
||||||
|
sourceCompatibility JavaVersion.VERSION_1_8
|
||||||
|
targetCompatibility JavaVersion.VERSION_1_8
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
task prepareAssets() {
|
||||||
|
def assetsFolder = "build/assets"
|
||||||
|
def projRoot = "../../.."
|
||||||
|
def gameToCopy = "minetest_game"
|
||||||
|
|
||||||
|
copy {
|
||||||
|
from "${projRoot}/minetest.conf.example", "${projRoot}/README.md" into assetsFolder
|
||||||
|
}
|
||||||
|
copy {
|
||||||
|
from "${projRoot}/doc/lgpl-2.1.txt" into "${assetsFolder}"
|
||||||
|
rename("lgpl-2.1.txt", "LICENSE.txt")
|
||||||
|
}
|
||||||
|
copy {
|
||||||
|
from "${projRoot}/builtin" into "${assetsFolder}/builtin"
|
||||||
|
}
|
||||||
|
copy {
|
||||||
|
from "${projRoot}/client/shaders" into "${assetsFolder}/client/shaders"
|
||||||
|
}
|
||||||
|
copy {
|
||||||
|
from "${projRoot}/fonts" include "*.ttf" into "${assetsFolder}/fonts"
|
||||||
|
}
|
||||||
|
copy {
|
||||||
|
from "${projRoot}/games/${gameToCopy}" into "${assetsFolder}/games/${gameToCopy}"
|
||||||
|
}
|
||||||
|
/*copy {
|
||||||
|
// locales broken right now
|
||||||
|
// ToDo: fix it!
|
||||||
|
from "${projRoot}/po" into "${assetsFolder}/po"
|
||||||
|
}*/
|
||||||
|
copy {
|
||||||
|
from "${projRoot}/textures" into "${assetsFolder}/textures"
|
||||||
|
}
|
||||||
|
|
||||||
|
task zipAssets(type: Zip) {
|
||||||
|
archiveName "Minetest.zip"
|
||||||
|
from "${assetsFolder}"
|
||||||
|
destinationDir file("src/main/assets")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
preBuild.dependsOn zipAssets
|
||||||
|
|
||||||
|
// Map for the version code that gives each ABI a value.
|
||||||
|
import com.android.build.OutputFile
|
||||||
|
|
||||||
|
def abiCodes = ['armeabi-v7a': 0, 'arm64-v8a': 1]
|
||||||
|
android.applicationVariants.all { variant ->
|
||||||
|
variant.outputs.each {
|
||||||
|
output ->
|
||||||
|
def abiName = output.getFilter(OutputFile.ABI)
|
||||||
|
output.versionCodeOverride = abiCodes.get(abiName, 0) + variant.versionCode
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
dependencies {
|
||||||
|
implementation project(':native')
|
||||||
|
implementation 'androidx.appcompat:appcompat:1.1.0'
|
||||||
|
}
|
@ -4,28 +4,24 @@
|
|||||||
package="net.minetest.minetest"
|
package="net.minetest.minetest"
|
||||||
android:installLocation="auto">
|
android:installLocation="auto">
|
||||||
|
|
||||||
<uses-feature
|
|
||||||
android:glEsVersion="0x00010000"
|
|
||||||
android:required="true" />
|
|
||||||
|
|
||||||
<uses-permission android:name="android.permission.INTERNET" />
|
<uses-permission android:name="android.permission.INTERNET" />
|
||||||
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
|
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
|
||||||
|
|
||||||
<application
|
<application
|
||||||
|
android:allowBackup="false"
|
||||||
android:icon="@mipmap/ic_launcher"
|
android:icon="@mipmap/ic_launcher"
|
||||||
android:label="${project}"
|
android:label="@string/label"
|
||||||
android:resizeableActivity="false"
|
android:resizeableActivity="false"
|
||||||
tools:targetApi="n">
|
tools:ignore="UnusedAttribute">
|
||||||
|
|
||||||
<meta-data
|
<meta-data
|
||||||
android:name="android.max_aspect"
|
android:name="android.max_aspect"
|
||||||
android:value="2.4" />
|
android:value="3" />
|
||||||
|
|
||||||
<activity
|
<activity
|
||||||
android:name=".MainActivity"
|
android:name=".MainActivity"
|
||||||
android:configChanges="orientation|keyboardHidden|navigation|screenSize"
|
android:configChanges="orientation|keyboardHidden|navigation|screenSize"
|
||||||
android:label="${project}"
|
android:maxAspectRatio="3"
|
||||||
android:launchMode="singleTask"
|
|
||||||
android:screenOrientation="sensorLandscape"
|
android:screenOrientation="sensorLandscape"
|
||||||
android:theme="@style/AppTheme">
|
android:theme="@style/AppTheme">
|
||||||
<intent-filter>
|
<intent-filter>
|
||||||
@ -33,11 +29,13 @@
|
|||||||
<category android:name="android.intent.category.LAUNCHER" />
|
<category android:name="android.intent.category.LAUNCHER" />
|
||||||
</intent-filter>
|
</intent-filter>
|
||||||
</activity>
|
</activity>
|
||||||
|
|
||||||
<activity
|
<activity
|
||||||
android:name=".MtNativeActivity"
|
android:name=".GameActivity"
|
||||||
android:configChanges="orientation|keyboard|keyboardHidden|navigation|screenSize|smallestScreenSize"
|
android:configChanges="orientation|keyboard|keyboardHidden|navigation|screenSize|smallestScreenSize"
|
||||||
android:hardwareAccelerated="true"
|
android:hardwareAccelerated="true"
|
||||||
android:launchMode="singleTask"
|
android:launchMode="singleTask"
|
||||||
|
android:maxAspectRatio="3"
|
||||||
android:screenOrientation="sensorLandscape"
|
android:screenOrientation="sensorLandscape"
|
||||||
android:theme="@style/AppTheme">
|
android:theme="@style/AppTheme">
|
||||||
<intent-filter>
|
<intent-filter>
|
||||||
@ -45,16 +43,18 @@
|
|||||||
</intent-filter>
|
</intent-filter>
|
||||||
<meta-data
|
<meta-data
|
||||||
android:name="android.app.lib_name"
|
android:name="android.app.lib_name"
|
||||||
android:value="minetest" />
|
android:value="Minetest" />
|
||||||
</activity>
|
</activity>
|
||||||
|
|
||||||
<activity
|
<activity
|
||||||
android:name=".MinetestTextEntry"
|
android:name=".InputDialogActivity"
|
||||||
android:configChanges="keyboardHidden|orientation|screenSize"
|
android:maxAspectRatio="3"
|
||||||
android:theme="@style/Theme.Dialog"
|
android:theme="@style/InputTheme" />
|
||||||
android:windowSoftInputMode="stateAlwaysHidden" />
|
|
||||||
<activity
|
<service
|
||||||
android:name=".MinetestAssetCopy"
|
android:name=".UnzipService"
|
||||||
android:screenOrientation="sensorLandscape"
|
android:enabled="true"
|
||||||
android:theme="@style/AppTheme" />
|
android:exported="false" />
|
||||||
</application>
|
</application>
|
||||||
|
|
||||||
</manifest>
|
</manifest>
|
@ -0,0 +1,82 @@
|
|||||||
|
/*
|
||||||
|
Minetest
|
||||||
|
Copyright (C) 2014-2020 MoNTE48, Maksim Gamarnik <MoNTE48@mail.ua>
|
||||||
|
Copyright (C) 2014-2020 ubulem, Bektur Mambetov <berkut87@gmail.com>
|
||||||
|
|
||||||
|
This program is free software; you can redistribute it and/or modify
|
||||||
|
it under the terms of the GNU Lesser General Public License as published by
|
||||||
|
the Free Software Foundation; either version 2.1 of the License, or
|
||||||
|
(at your option) any later version.
|
||||||
|
|
||||||
|
This program is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
GNU Lesser General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU Lesser General Public License along
|
||||||
|
with this program; if not, write to the Free Software Foundation, Inc.,
|
||||||
|
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package net.minetest.minetest;
|
||||||
|
|
||||||
|
import android.content.Context;
|
||||||
|
import android.content.Intent;
|
||||||
|
import android.os.AsyncTask;
|
||||||
|
import android.util.Log;
|
||||||
|
|
||||||
|
import java.io.FileOutputStream;
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.io.InputStream;
|
||||||
|
import java.io.OutputStream;
|
||||||
|
import java.lang.ref.WeakReference;
|
||||||
|
|
||||||
|
public class CopyZipTask extends AsyncTask<String, Void, String> {
|
||||||
|
|
||||||
|
private final WeakReference<Context> contextRef;
|
||||||
|
|
||||||
|
CopyZipTask(Context context) {
|
||||||
|
contextRef = new WeakReference<>(context);
|
||||||
|
}
|
||||||
|
|
||||||
|
protected String doInBackground(String... params) {
|
||||||
|
copyAssets(params);
|
||||||
|
return params[0];
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void onPostExecute(String result) {
|
||||||
|
startUnzipService(result);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void copyAsset(String zipName) throws IOException {
|
||||||
|
String filename = zipName.substring(zipName.lastIndexOf("/") + 1);
|
||||||
|
try (InputStream in = contextRef.get().getAssets().open(filename);
|
||||||
|
OutputStream out = new FileOutputStream(zipName)) {
|
||||||
|
copyFile(in, out);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void copyAssets(String[] zips) {
|
||||||
|
try {
|
||||||
|
for (String zipName : zips)
|
||||||
|
copyAsset(zipName);
|
||||||
|
} catch (IOException e) {
|
||||||
|
Log.e("CopyZipTask", e.getLocalizedMessage());
|
||||||
|
cancel(true);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void copyFile(InputStream in, OutputStream out) throws IOException {
|
||||||
|
byte[] buffer = new byte[1024];
|
||||||
|
int read;
|
||||||
|
while ((read = in.read(buffer)) != -1)
|
||||||
|
out.write(buffer, 0, read);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void startUnzipService(String file) {
|
||||||
|
Intent intent = new Intent(contextRef.get(), UnzipService.class);
|
||||||
|
intent.putExtra(UnzipService.EXTRA_KEY_IN_FILE, file);
|
||||||
|
contextRef.get().startService(intent);
|
||||||
|
}
|
||||||
|
}
|
@ -1,3 +1,23 @@
|
|||||||
|
/*
|
||||||
|
Minetest
|
||||||
|
Copyright (C) 2014-2020 MoNTE48, Maksim Gamarnik <MoNTE48@mail.ua>
|
||||||
|
Copyright (C) 2014-2020 ubulem, Bektur Mambetov <berkut87@gmail.com>
|
||||||
|
|
||||||
|
This program is free software; you can redistribute it and/or modify
|
||||||
|
it under the terms of the GNU Lesser General Public License as published by
|
||||||
|
the Free Software Foundation; either version 2.1 of the License, or
|
||||||
|
(at your option) any later version.
|
||||||
|
|
||||||
|
This program is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
GNU Lesser General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU Lesser General Public License along
|
||||||
|
with this program; if not, write to the Free Software Foundation, Inc.,
|
||||||
|
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||||
|
*/
|
||||||
|
|
||||||
package net.minetest.minetest;
|
package net.minetest.minetest;
|
||||||
|
|
||||||
import android.app.NativeActivity;
|
import android.app.NativeActivity;
|
||||||
@ -7,19 +27,14 @@ import android.os.Bundle;
|
|||||||
import android.view.View;
|
import android.view.View;
|
||||||
import android.view.WindowManager;
|
import android.view.WindowManager;
|
||||||
|
|
||||||
public class MtNativeActivity extends NativeActivity {
|
public class GameActivity extends NativeActivity {
|
||||||
|
|
||||||
static {
|
static {
|
||||||
System.loadLibrary("c++_shared");
|
System.loadLibrary("c++_shared");
|
||||||
System.loadLibrary("openal");
|
System.loadLibrary("Minetest");
|
||||||
System.loadLibrary("ogg");
|
|
||||||
System.loadLibrary("vorbis");
|
|
||||||
System.loadLibrary("iconv");
|
|
||||||
System.loadLibrary("minetest");
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private int m_MessagReturnCode;
|
private int messageReturnCode;
|
||||||
private String m_MessageReturnValue;
|
private String messageReturnValue;
|
||||||
|
|
||||||
public static native void putMessageBoxResult(String text);
|
public static native void putMessageBoxResult(String text);
|
||||||
|
|
||||||
@ -27,20 +42,16 @@ public class MtNativeActivity extends NativeActivity {
|
|||||||
public void onCreate(Bundle savedInstanceState) {
|
public void onCreate(Bundle savedInstanceState) {
|
||||||
super.onCreate(savedInstanceState);
|
super.onCreate(savedInstanceState);
|
||||||
getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
|
getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
|
||||||
m_MessagReturnCode = -1;
|
messageReturnCode = -1;
|
||||||
m_MessageReturnValue = "";
|
messageReturnValue = "";
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected void onResume() {
|
|
||||||
super.onResume();
|
|
||||||
makeFullScreen();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private void makeFullScreen() {
|
private void makeFullScreen() {
|
||||||
if (Build.VERSION.SDK_INT >= 19)
|
if (Build.VERSION.SDK_INT >= 19)
|
||||||
this.getWindow().getDecorView().setSystemUiVisibility(
|
this.getWindow().getDecorView().setSystemUiVisibility(
|
||||||
View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY);
|
View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION |
|
||||||
|
View.SYSTEM_UI_FLAG_HIDE_NAVIGATION |
|
||||||
|
View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@ -50,15 +61,31 @@ public class MtNativeActivity extends NativeActivity {
|
|||||||
makeFullScreen();
|
makeFullScreen();
|
||||||
}
|
}
|
||||||
|
|
||||||
public void copyAssets() {
|
@Override
|
||||||
Intent intent = new Intent(this, MinetestAssetCopy.class);
|
protected void onResume() {
|
||||||
startActivity(intent);
|
super.onResume();
|
||||||
|
makeFullScreen();
|
||||||
}
|
}
|
||||||
|
|
||||||
public void showDialog(String acceptButton, String hint, String current,
|
@Override
|
||||||
int editType) {
|
public void onBackPressed() {
|
||||||
|
// Ignore the back press so Minetest can handle it
|
||||||
|
}
|
||||||
|
|
||||||
Intent intent = new Intent(this, MinetestTextEntry.class);
|
@Override
|
||||||
|
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
|
||||||
|
if (requestCode == 101) {
|
||||||
|
if (resultCode == RESULT_OK) {
|
||||||
|
String text = data.getStringExtra("text");
|
||||||
|
messageReturnCode = 0;
|
||||||
|
messageReturnValue = text;
|
||||||
|
} else
|
||||||
|
messageReturnCode = 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void showDialog(String acceptButton, String hint, String current, int editType) {
|
||||||
|
Intent intent = new Intent(this, InputDialogActivity.class);
|
||||||
Bundle params = new Bundle();
|
Bundle params = new Bundle();
|
||||||
params.putString("acceptButton", acceptButton);
|
params.putString("acceptButton", acceptButton);
|
||||||
params.putString("hint", hint);
|
params.putString("hint", hint);
|
||||||
@ -66,43 +93,28 @@ public class MtNativeActivity extends NativeActivity {
|
|||||||
params.putInt("editType", editType);
|
params.putInt("editType", editType);
|
||||||
intent.putExtras(params);
|
intent.putExtras(params);
|
||||||
startActivityForResult(intent, 101);
|
startActivityForResult(intent, 101);
|
||||||
m_MessageReturnValue = "";
|
messageReturnValue = "";
|
||||||
m_MessagReturnCode = -1;
|
messageReturnCode = -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* ugly code to workaround putMessageBoxResult not beeing found */
|
|
||||||
public int getDialogState() {
|
public int getDialogState() {
|
||||||
return m_MessagReturnCode;
|
return messageReturnCode;
|
||||||
}
|
}
|
||||||
|
|
||||||
public String getDialogValue() {
|
public String getDialogValue() {
|
||||||
m_MessagReturnCode = -1;
|
messageReturnCode = -1;
|
||||||
return m_MessageReturnValue;
|
return messageReturnValue;
|
||||||
}
|
}
|
||||||
|
|
||||||
public float getDensity() {
|
public float getDensity() {
|
||||||
return getResources().getDisplayMetrics().density;
|
return getResources().getDisplayMetrics().density;
|
||||||
}
|
}
|
||||||
|
|
||||||
public int getDisplayWidth() {
|
|
||||||
return getResources().getDisplayMetrics().widthPixels;
|
|
||||||
}
|
|
||||||
|
|
||||||
public int getDisplayHeight() {
|
public int getDisplayHeight() {
|
||||||
return getResources().getDisplayMetrics().heightPixels;
|
return getResources().getDisplayMetrics().heightPixels;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
public int getDisplayWidth() {
|
||||||
protected void onActivityResult(int requestCode, int resultCode,
|
return getResources().getDisplayMetrics().widthPixels;
|
||||||
Intent data) {
|
|
||||||
if (requestCode == 101) {
|
|
||||||
if (resultCode == RESULT_OK) {
|
|
||||||
String text = data.getStringExtra("text");
|
|
||||||
m_MessagReturnCode = 0;
|
|
||||||
m_MessageReturnValue = text;
|
|
||||||
} else {
|
|
||||||
m_MessagReturnCode = 1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
@ -0,0 +1,98 @@
|
|||||||
|
/*
|
||||||
|
Minetest
|
||||||
|
Copyright (C) 2014-2020 MoNTE48, Maksim Gamarnik <MoNTE48@mail.ua>
|
||||||
|
Copyright (C) 2014-2020 ubulem, Bektur Mambetov <berkut87@gmail.com>
|
||||||
|
|
||||||
|
This program is free software; you can redistribute it and/or modify
|
||||||
|
it under the terms of the GNU Lesser General Public License as published by
|
||||||
|
the Free Software Foundation; either version 2.1 of the License, or
|
||||||
|
(at your option) any later version.
|
||||||
|
|
||||||
|
This program is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
GNU Lesser General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU Lesser General Public License along
|
||||||
|
with this program; if not, write to the Free Software Foundation, Inc.,
|
||||||
|
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package net.minetest.minetest;
|
||||||
|
|
||||||
|
import android.app.Activity;
|
||||||
|
import android.content.Intent;
|
||||||
|
import android.os.Build;
|
||||||
|
import android.os.Bundle;
|
||||||
|
import android.text.InputType;
|
||||||
|
import android.view.KeyEvent;
|
||||||
|
import android.view.View;
|
||||||
|
import android.view.inputmethod.InputMethodManager;
|
||||||
|
import android.widget.EditText;
|
||||||
|
|
||||||
|
import androidx.appcompat.app.AlertDialog;
|
||||||
|
import androidx.appcompat.app.AppCompatActivity;
|
||||||
|
|
||||||
|
import java.util.Objects;
|
||||||
|
|
||||||
|
public class InputDialogActivity extends AppCompatActivity {
|
||||||
|
private AlertDialog alertDialog;
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onCreate(Bundle savedInstanceState) {
|
||||||
|
super.onCreate(savedInstanceState);
|
||||||
|
Bundle b = getIntent().getExtras();
|
||||||
|
int editType = Objects.requireNonNull(b).getInt("editType");
|
||||||
|
String hint = b.getString("hint");
|
||||||
|
String current = b.getString("current");
|
||||||
|
final AlertDialog.Builder builder = new AlertDialog.Builder(this);
|
||||||
|
EditText editText = new EditText(this);
|
||||||
|
builder.setView(editText);
|
||||||
|
editText.requestFocus();
|
||||||
|
editText.setHint(hint);
|
||||||
|
editText.setText(current);
|
||||||
|
final InputMethodManager imm = (InputMethodManager) getSystemService(INPUT_METHOD_SERVICE);
|
||||||
|
Objects.requireNonNull(imm).toggleSoftInput(InputMethodManager.SHOW_FORCED,
|
||||||
|
InputMethodManager.HIDE_IMPLICIT_ONLY);
|
||||||
|
if (editType == 3)
|
||||||
|
editText.setInputType(InputType.TYPE_CLASS_TEXT |
|
||||||
|
InputType.TYPE_TEXT_VARIATION_PASSWORD);
|
||||||
|
else
|
||||||
|
editText.setInputType(InputType.TYPE_CLASS_TEXT);
|
||||||
|
editText.setOnKeyListener((view, KeyCode, event) -> {
|
||||||
|
if (KeyCode == KeyEvent.KEYCODE_ENTER) {
|
||||||
|
imm.hideSoftInputFromWindow(editText.getWindowToken(), 0);
|
||||||
|
pushResult(editText.getText().toString());
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
});
|
||||||
|
alertDialog = builder.create();
|
||||||
|
if (!this.isFinishing())
|
||||||
|
alertDialog.show();
|
||||||
|
alertDialog.setOnCancelListener(dialog -> {
|
||||||
|
pushResult(editText.getText().toString());
|
||||||
|
setResult(Activity.RESULT_CANCELED);
|
||||||
|
alertDialog.dismiss();
|
||||||
|
makeFullScreen();
|
||||||
|
finish();
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
private void pushResult(String text) {
|
||||||
|
Intent resultData = new Intent();
|
||||||
|
resultData.putExtra("text", text);
|
||||||
|
setResult(AppCompatActivity.RESULT_OK, resultData);
|
||||||
|
alertDialog.dismiss();
|
||||||
|
makeFullScreen();
|
||||||
|
finish();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void makeFullScreen() {
|
||||||
|
if (Build.VERSION.SDK_INT >= 19)
|
||||||
|
this.getWindow().getDecorView().setSystemUiVisibility(
|
||||||
|
View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION |
|
||||||
|
View.SYSTEM_UI_FLAG_HIDE_NAVIGATION |
|
||||||
|
View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY);
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,139 @@
|
|||||||
|
/*
|
||||||
|
Minetest
|
||||||
|
Copyright (C) 2014-2020 MoNTE48, Maksim Gamarnik <MoNTE48@mail.ua>
|
||||||
|
Copyright (C) 2014-2020 ubulem, Bektur Mambetov <berkut87@gmail.com>
|
||||||
|
|
||||||
|
This program is free software; you can redistribute it and/or modify
|
||||||
|
it under the terms of the GNU Lesser General Public License as published by
|
||||||
|
the Free Software Foundation; either version 2.1 of the License, or
|
||||||
|
(at your option) any later version.
|
||||||
|
|
||||||
|
This program is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
GNU Lesser General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU Lesser General Public License along
|
||||||
|
with this program; if not, write to the Free Software Foundation, Inc.,
|
||||||
|
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package net.minetest.minetest;
|
||||||
|
|
||||||
|
import android.Manifest;
|
||||||
|
import android.content.BroadcastReceiver;
|
||||||
|
import android.content.Context;
|
||||||
|
import android.content.Intent;
|
||||||
|
import android.content.IntentFilter;
|
||||||
|
import android.content.SharedPreferences;
|
||||||
|
import android.content.pm.PackageManager;
|
||||||
|
import android.os.Build;
|
||||||
|
import android.os.Bundle;
|
||||||
|
import android.view.View;
|
||||||
|
import android.widget.ProgressBar;
|
||||||
|
import android.widget.TextView;
|
||||||
|
import android.widget.Toast;
|
||||||
|
|
||||||
|
import androidx.annotation.NonNull;
|
||||||
|
import androidx.appcompat.app.AppCompatActivity;
|
||||||
|
import androidx.core.app.ActivityCompat;
|
||||||
|
import androidx.core.content.ContextCompat;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.Arrays;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
public class MainActivity extends AppCompatActivity {
|
||||||
|
private final static int versionCode = BuildConfig.VERSION_CODE;
|
||||||
|
private final static int PERMISSIONS = 1;
|
||||||
|
private static final String[] REQUIRED_SDK_PERMISSIONS =
|
||||||
|
new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE};
|
||||||
|
private static final String SETTINGS = "MinetestSettings";
|
||||||
|
private static final String TAG_VERSION_CODE = "versionCode";
|
||||||
|
private ProgressBar mProgressBar;
|
||||||
|
private TextView mTextView;
|
||||||
|
private SharedPreferences sharedPreferences;
|
||||||
|
private final BroadcastReceiver myReceiver = new BroadcastReceiver() {
|
||||||
|
@Override
|
||||||
|
public void onReceive(Context context, Intent intent) {
|
||||||
|
int progress = 0;
|
||||||
|
if (intent != null)
|
||||||
|
progress = intent.getIntExtra(UnzipService.ACTION_PROGRESS, 0);
|
||||||
|
if (progress >= 0) {
|
||||||
|
if (mProgressBar != null) {
|
||||||
|
mProgressBar.setVisibility(View.VISIBLE);
|
||||||
|
mProgressBar.setProgress(progress);
|
||||||
|
}
|
||||||
|
mTextView.setVisibility(View.VISIBLE);
|
||||||
|
} else
|
||||||
|
startNative();
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onCreate(Bundle savedInstanceState) {
|
||||||
|
super.onCreate(savedInstanceState);
|
||||||
|
setContentView(R.layout.activity_main);
|
||||||
|
IntentFilter filter = new IntentFilter(UnzipService.ACTION_UPDATE);
|
||||||
|
registerReceiver(myReceiver, filter);
|
||||||
|
mProgressBar = findViewById(R.id.progressBar);
|
||||||
|
mTextView = findViewById(R.id.textView);
|
||||||
|
sharedPreferences = getSharedPreferences(SETTINGS, Context.MODE_PRIVATE);
|
||||||
|
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M)
|
||||||
|
checkPermission();
|
||||||
|
else
|
||||||
|
checkAppVersion();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void checkPermission() {
|
||||||
|
final List<String> missingPermissions = new ArrayList<>();
|
||||||
|
for (final String permission : REQUIRED_SDK_PERMISSIONS) {
|
||||||
|
final int result = ContextCompat.checkSelfPermission(this, permission);
|
||||||
|
if (result != PackageManager.PERMISSION_GRANTED)
|
||||||
|
missingPermissions.add(permission);
|
||||||
|
}
|
||||||
|
if (!missingPermissions.isEmpty()) {
|
||||||
|
final String[] permissions = missingPermissions
|
||||||
|
.toArray(new String[0]);
|
||||||
|
ActivityCompat.requestPermissions(this, permissions, PERMISSIONS);
|
||||||
|
} else {
|
||||||
|
final int[] grantResults = new int[REQUIRED_SDK_PERMISSIONS.length];
|
||||||
|
Arrays.fill(grantResults, PackageManager.PERMISSION_GRANTED);
|
||||||
|
onRequestPermissionsResult(PERMISSIONS, REQUIRED_SDK_PERMISSIONS, grantResults);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onRequestPermissionsResult(int requestCode,
|
||||||
|
@NonNull String[] permissions, @NonNull int[] grantResults) {
|
||||||
|
if (requestCode == PERMISSIONS) {
|
||||||
|
for (int grantResult : grantResults) {
|
||||||
|
if (grantResult != PackageManager.PERMISSION_GRANTED) {
|
||||||
|
Toast.makeText(this, R.string.not_granted, Toast.LENGTH_LONG).show();
|
||||||
|
finish();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
checkAppVersion();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void checkAppVersion() {
|
||||||
|
if (sharedPreferences.getInt(TAG_VERSION_CODE, 0) == versionCode)
|
||||||
|
startNative();
|
||||||
|
else
|
||||||
|
new CopyZipTask(this).execute(getCacheDir() + "/Minetest.zip");
|
||||||
|
}
|
||||||
|
|
||||||
|
private void startNative() {
|
||||||
|
sharedPreferences.edit().putInt(TAG_VERSION_CODE, versionCode).apply();
|
||||||
|
Intent intent = new Intent(this, GameActivity.class);
|
||||||
|
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_CLEAR_TASK);
|
||||||
|
startActivity(intent);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void onDestroy() {
|
||||||
|
super.onDestroy();
|
||||||
|
unregisterReceiver(myReceiver);
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,153 @@
|
|||||||
|
/*
|
||||||
|
Minetest
|
||||||
|
Copyright (C) 2014-2020 MoNTE48, Maksim Gamarnik <MoNTE48@mail.ua>
|
||||||
|
Copyright (C) 2014-2020 ubulem, Bektur Mambetov <berkut87@gmail.com>
|
||||||
|
|
||||||
|
This program is free software; you can redistribute it and/or modify
|
||||||
|
it under the terms of the GNU Lesser General Public License as published by
|
||||||
|
the Free Software Foundation; either version 2.1 of the License, or
|
||||||
|
(at your option) any later version.
|
||||||
|
|
||||||
|
This program is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
GNU Lesser General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU Lesser General Public License along
|
||||||
|
with this program; if not, write to the Free Software Foundation, Inc.,
|
||||||
|
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package net.minetest.minetest;
|
||||||
|
|
||||||
|
import android.app.IntentService;
|
||||||
|
import android.app.Notification;
|
||||||
|
import android.app.NotificationChannel;
|
||||||
|
import android.app.NotificationManager;
|
||||||
|
import android.content.Context;
|
||||||
|
import android.content.Intent;
|
||||||
|
import android.os.Build;
|
||||||
|
import android.os.Environment;
|
||||||
|
import android.util.Log;
|
||||||
|
|
||||||
|
import java.io.File;
|
||||||
|
import java.io.FileInputStream;
|
||||||
|
import java.io.FileNotFoundException;
|
||||||
|
import java.io.FileOutputStream;
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.io.OutputStream;
|
||||||
|
import java.util.zip.ZipEntry;
|
||||||
|
import java.util.zip.ZipFile;
|
||||||
|
import java.util.zip.ZipInputStream;
|
||||||
|
|
||||||
|
public class UnzipService extends IntentService {
|
||||||
|
public static final String ACTION_UPDATE = "net.minetest.minetest.UPDATE";
|
||||||
|
public static final String ACTION_PROGRESS = "net.minetest.minetest.PROGRESS";
|
||||||
|
public static final String EXTRA_KEY_IN_FILE = "file";
|
||||||
|
private static final String TAG = "UnzipService";
|
||||||
|
private final int id = 1;
|
||||||
|
private NotificationManager mNotifyManager;
|
||||||
|
|
||||||
|
public UnzipService() {
|
||||||
|
super("net.minetest.minetest.UnzipService");
|
||||||
|
}
|
||||||
|
|
||||||
|
private void isDir(String dir, String location) {
|
||||||
|
File f = new File(location + dir);
|
||||||
|
if (!f.isDirectory())
|
||||||
|
f.mkdirs();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void onHandleIntent(Intent intent) {
|
||||||
|
createNotification();
|
||||||
|
unzip(intent);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void createNotification() {
|
||||||
|
String name = "net.minetest.minetest";
|
||||||
|
String channelId = "Minetest channel";
|
||||||
|
String description = "notifications from Minetest";
|
||||||
|
Notification.Builder builder;
|
||||||
|
if (mNotifyManager == null)
|
||||||
|
mNotifyManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
|
||||||
|
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
|
||||||
|
int importance = NotificationManager.IMPORTANCE_LOW;
|
||||||
|
NotificationChannel mChannel = null;
|
||||||
|
if (mNotifyManager != null)
|
||||||
|
mChannel = mNotifyManager.getNotificationChannel(channelId);
|
||||||
|
if (mChannel == null) {
|
||||||
|
mChannel = new NotificationChannel(channelId, name, importance);
|
||||||
|
mChannel.setDescription(description);
|
||||||
|
// Configure the notification channel, NO SOUND
|
||||||
|
mChannel.setSound(null, null);
|
||||||
|
mChannel.enableLights(false);
|
||||||
|
mChannel.enableVibration(false);
|
||||||
|
mNotifyManager.createNotificationChannel(mChannel);
|
||||||
|
}
|
||||||
|
builder = new Notification.Builder(this, channelId);
|
||||||
|
} else {
|
||||||
|
builder = new Notification.Builder(this);
|
||||||
|
}
|
||||||
|
builder.setContentTitle(getString(R.string.notification_title))
|
||||||
|
.setSmallIcon(R.mipmap.ic_launcher)
|
||||||
|
.setContentText(getString(R.string.notification_description));
|
||||||
|
mNotifyManager.notify(id, builder.build());
|
||||||
|
}
|
||||||
|
|
||||||
|
private void unzip(Intent intent) {
|
||||||
|
String zip = intent.getStringExtra(EXTRA_KEY_IN_FILE);
|
||||||
|
String location = Environment.getExternalStorageDirectory() + "/Minetest/";
|
||||||
|
int per = 0;
|
||||||
|
int size = getSummarySize(zip);
|
||||||
|
File zipFile = new File(zip);
|
||||||
|
int readLen;
|
||||||
|
byte[] readBuffer = new byte[8192];
|
||||||
|
try (FileInputStream fileInputStream = new FileInputStream(zipFile);
|
||||||
|
ZipInputStream zipInputStream = new ZipInputStream(fileInputStream)) {
|
||||||
|
ZipEntry ze;
|
||||||
|
while ((ze = zipInputStream.getNextEntry()) != null) {
|
||||||
|
if (ze.isDirectory()) {
|
||||||
|
++per;
|
||||||
|
isDir(ze.getName(), location);
|
||||||
|
} else {
|
||||||
|
publishProgress(100 * ++per / size);
|
||||||
|
try (OutputStream outputStream = new FileOutputStream(location + ze.getName())) {
|
||||||
|
while ((readLen = zipInputStream.read(readBuffer)) != -1) {
|
||||||
|
outputStream.write(readBuffer, 0, readLen);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
zipFile.delete();
|
||||||
|
}
|
||||||
|
} catch (FileNotFoundException e) {
|
||||||
|
Log.e(TAG, e.getLocalizedMessage());
|
||||||
|
} catch (IOException e) {
|
||||||
|
Log.e(TAG, e.getLocalizedMessage());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void publishProgress(int progress) {
|
||||||
|
Intent intentUpdate = new Intent(ACTION_UPDATE);
|
||||||
|
intentUpdate.putExtra(ACTION_PROGRESS, progress);
|
||||||
|
sendBroadcast(intentUpdate);
|
||||||
|
}
|
||||||
|
|
||||||
|
private int getSummarySize(String zip) {
|
||||||
|
int size = 0;
|
||||||
|
try {
|
||||||
|
ZipFile zipSize = new ZipFile(zip);
|
||||||
|
size += zipSize.size();
|
||||||
|
} catch (IOException e) {
|
||||||
|
Log.e(TAG, e.getLocalizedMessage());
|
||||||
|
}
|
||||||
|
return size;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onDestroy() {
|
||||||
|
super.onDestroy();
|
||||||
|
mNotifyManager.cancel(id);
|
||||||
|
publishProgress(-1);
|
||||||
|
}
|
||||||
|
}
|
Before Width: | Height: | Size: 83 B After Width: | Height: | Size: 83 B |
30
build/android/app/src/main/res/layout/activity_main.xml
Normal file
30
build/android/app/src/main/res/layout/activity_main.xml
Normal file
@ -0,0 +1,30 @@
|
|||||||
|
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
android:id="@+id/activity_main"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="match_parent"
|
||||||
|
android:background="@drawable/bg">
|
||||||
|
|
||||||
|
<ProgressBar
|
||||||
|
android:id="@+id/progressBar"
|
||||||
|
style="@style/CustomProgressBar"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="30dp"
|
||||||
|
android:layout_centerInParent="true"
|
||||||
|
android:layout_marginLeft="90dp"
|
||||||
|
android:layout_marginRight="90dp"
|
||||||
|
android:indeterminate="false"
|
||||||
|
android:max="100"
|
||||||
|
android:visibility="gone" />
|
||||||
|
|
||||||
|
<TextView
|
||||||
|
android:id="@+id/textView"
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_below="@id/progressBar"
|
||||||
|
android:layout_centerInParent="true"
|
||||||
|
android:background="@android:color/transparent"
|
||||||
|
android:text="@string/loading"
|
||||||
|
android:textColor="#FEFEFE"
|
||||||
|
android:visibility="gone" />
|
||||||
|
|
||||||
|
</RelativeLayout>
|
Before Width: | Height: | Size: 5.6 KiB After Width: | Height: | Size: 5.6 KiB |
10
build/android/app/src/main/res/values/strings.xml
Normal file
10
build/android/app/src/main/res/values/strings.xml
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<resources>
|
||||||
|
|
||||||
|
<string name="label">Minetest</string>
|
||||||
|
<string name="loading">Loading…</string>
|
||||||
|
<string name="not_granted">Required permission wasn\'t granted, Minetest can\'t run without it</string>
|
||||||
|
<string name="notification_title">Loading Minetest</string>
|
||||||
|
<string name="notification_description">Less than 1 minute…</string>
|
||||||
|
|
||||||
|
</resources>
|
22
build/android/app/src/main/res/values/styles.xml
Normal file
22
build/android/app/src/main/res/values/styles.xml
Normal file
@ -0,0 +1,22 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<resources xmlns:tools="http://schemas.android.com/tools">
|
||||||
|
|
||||||
|
<style name="AppTheme" parent="Theme.AppCompat.DayNight.NoActionBar">
|
||||||
|
<item name="windowActionBar">false</item>
|
||||||
|
<item name="android:windowFullscreen">true</item>
|
||||||
|
<item name="android:windowBackground">@drawable/bg</item>
|
||||||
|
<item name="android:windowLayoutInDisplayCutoutMode" tools:targetApi="p">shortEdges</item>
|
||||||
|
</style>
|
||||||
|
|
||||||
|
<style name="InputTheme" parent="Theme.AppCompat.DayNight.Dialog">
|
||||||
|
<item name="windowNoTitle">true</item>
|
||||||
|
<item name="android:windowBackground">@android:color/transparent</item>
|
||||||
|
</style>
|
||||||
|
|
||||||
|
<style name="CustomProgressBar" parent="@style/Widget.AppCompat.ProgressBar.Horizontal">
|
||||||
|
<item name="android:indeterminateOnly">false</item>
|
||||||
|
<item name="android:minHeight">10dip</item>
|
||||||
|
<item name="android:maxHeight">20dip</item>
|
||||||
|
</style>
|
||||||
|
|
||||||
|
</resources>
|
@ -1,10 +1,24 @@
|
|||||||
|
// Top-level build file where you can add configuration options common to all sub-projects/modules.
|
||||||
|
|
||||||
|
project.ext.set("versionMajor", 5) // Version Major
|
||||||
|
project.ext.set("versionMinor", 3) // Version Minor
|
||||||
|
project.ext.set("versionPatch", 0) // Version Patch
|
||||||
|
project.ext.set("versionExtra", "-dev") // Version Extra
|
||||||
|
project.ext.set("versionCode", 26) // Android Version Code
|
||||||
|
// NOTE: +2 after each release!
|
||||||
|
// +1 for ARM and +1 for ARM64 APK's, because
|
||||||
|
// each APK must have a larger `versionCode` than the previous
|
||||||
|
|
||||||
buildscript {
|
buildscript {
|
||||||
repositories {
|
repositories {
|
||||||
google()
|
google()
|
||||||
jcenter()
|
jcenter()
|
||||||
}
|
}
|
||||||
dependencies {
|
dependencies {
|
||||||
classpath 'com.android.tools.build:gradle:3.5.1'
|
classpath 'com.android.tools.build:gradle:3.6.2'
|
||||||
|
classpath 'org.ajoberstar.grgit:grgit-gradle:4.0.2'
|
||||||
|
// NOTE: Do not place your application dependencies here; they belong
|
||||||
|
// in the individual module build.gradle files
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -15,161 +29,6 @@ allprojects {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
def curl_version = "7.60.0"
|
task clean(type: Delete) {
|
||||||
def irrlicht_revision = "5150"
|
delete rootProject.buildDir
|
||||||
def openal_version = "1.18.2"
|
|
||||||
def openssl_version = "1.0.2n"
|
|
||||||
def sqlite3_version = "3240000"
|
|
||||||
|
|
||||||
apply plugin: "com.android.application"
|
|
||||||
|
|
||||||
android {
|
|
||||||
compileSdkVersion 29
|
|
||||||
buildToolsVersion '29.0.2'
|
|
||||||
|
|
||||||
defaultConfig {
|
|
||||||
versionCode 26
|
|
||||||
versionName "${System.env.VERSION_STR}.${versionCode}"
|
|
||||||
minSdkVersion 14
|
|
||||||
targetSdkVersion 29
|
|
||||||
applicationId "net.minetest.minetest"
|
|
||||||
manifestPlaceholders = [package: "net.minetest.minetest", project: project.name]
|
|
||||||
ndk {
|
|
||||||
// Specifies the ABI configurations of your native
|
|
||||||
// libraries Gradle should build and package with your APK.
|
|
||||||
// abiFilters 'armeabi-v7a', 'arm64-v8a', 'x86', 'x86_64'
|
|
||||||
abiFilters 'armeabi-v7a', 'x86', 'arm64-v8a'
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
compileOptions {
|
|
||||||
sourceCompatibility JavaVersion.VERSION_1_8
|
|
||||||
targetCompatibility JavaVersion.VERSION_1_8
|
|
||||||
}
|
|
||||||
|
|
||||||
lintOptions {
|
|
||||||
disable "OldTargetApi", "GoogleAppIndexingWarning"
|
|
||||||
}
|
|
||||||
|
|
||||||
Properties props = new Properties()
|
|
||||||
props.load(new FileInputStream(file("local.properties")))
|
|
||||||
|
|
||||||
if (props.getProperty("keystore") != null) {
|
|
||||||
signingConfigs {
|
|
||||||
release {
|
|
||||||
storeFile file(props["keystore"])
|
|
||||||
storePassword props["keystore.password"]
|
|
||||||
keyAlias props["key"]
|
|
||||||
keyPassword props["key.password"]
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
buildTypes {
|
|
||||||
release {
|
|
||||||
signingConfig signingConfigs.release
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
task cleanAssets(type: Delete) {
|
|
||||||
delete 'src/main/assets'
|
|
||||||
}
|
|
||||||
|
|
||||||
task copyAssets {
|
|
||||||
dependsOn 'cleanAssets'
|
|
||||||
mkdir "src/main/assets"
|
|
||||||
|
|
||||||
def mtAssetsFolder = "src/main/assets/Minetest"
|
|
||||||
def projRoot = "../.."
|
|
||||||
def gameToCopy = "minetest_game"
|
|
||||||
|
|
||||||
doLast {
|
|
||||||
mkdir "${mtAssetsFolder}"
|
|
||||||
mkdir "${mtAssetsFolder}/client"
|
|
||||||
mkdir "${mtAssetsFolder}/fonts"
|
|
||||||
mkdir "${mtAssetsFolder}/games"
|
|
||||||
mkdir "${mtAssetsFolder}/media"
|
|
||||||
|
|
||||||
copy {
|
|
||||||
from "${projRoot}/minetest.conf.example", "${projRoot}/README.md" into mtAssetsFolder
|
|
||||||
}
|
|
||||||
copy {
|
|
||||||
from "${projRoot}/doc/lgpl-2.1.txt" into "${mtAssetsFolder}/LICENSE.txt"
|
|
||||||
}
|
|
||||||
copy {
|
|
||||||
from "${projRoot}/builtin" into "${mtAssetsFolder}/builtin"
|
|
||||||
}
|
|
||||||
copy {
|
|
||||||
from "${projRoot}/client/shaders" into "${mtAssetsFolder}/client/shaders"
|
|
||||||
}
|
|
||||||
copy {
|
|
||||||
from "${projRoot}/fonts" include "*.ttf" into "${mtAssetsFolder}/fonts"
|
|
||||||
}
|
|
||||||
copy {
|
|
||||||
from "${projRoot}/games/${gameToCopy}" into "${mtAssetsFolder}/games/${gameToCopy}"
|
|
||||||
}
|
|
||||||
copy {
|
|
||||||
from "${projRoot}/po" into "${mtAssetsFolder}/po"
|
|
||||||
}
|
|
||||||
copy {
|
|
||||||
from "${projRoot}/textures" into "${mtAssetsFolder}/textures"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
task cleanIconv(type: Delete) {
|
|
||||||
delete 'deps/libiconv'
|
|
||||||
}
|
|
||||||
|
|
||||||
task cleanIrrlicht(type: Delete) {
|
|
||||||
delete 'deps/irrlicht'
|
|
||||||
}
|
|
||||||
|
|
||||||
task cleanLevelDB(type: Delete) {
|
|
||||||
delete 'deps/leveldb'
|
|
||||||
}
|
|
||||||
|
|
||||||
task cleanCURL(type: Delete) {
|
|
||||||
delete 'deps/curl'
|
|
||||||
delete 'deps/curl-' + curl_version
|
|
||||||
}
|
|
||||||
|
|
||||||
task cleanOpenSSL(type: Delete) {
|
|
||||||
delete 'deps/openssl'
|
|
||||||
delete 'deps/openssl-' + openssl_version
|
|
||||||
delete 'deps/openssl-' + openssl_version + '.tar.gz'
|
|
||||||
}
|
|
||||||
|
|
||||||
task cleanOpenAL(type: Delete) {
|
|
||||||
delete 'deps/openal-soft'
|
|
||||||
}
|
|
||||||
|
|
||||||
task cleanFreetype(type: Delete) {
|
|
||||||
delete 'deps/freetype2-android'
|
|
||||||
}
|
|
||||||
|
|
||||||
task cleanOgg(type: Delete) {
|
|
||||||
delete 'deps/libvorbis-libogg-android'
|
|
||||||
}
|
|
||||||
|
|
||||||
task cleanSQLite3(type: Delete) {
|
|
||||||
delete 'deps/sqlite-amalgamation-' + sqlite3_version
|
|
||||||
delete 'deps/sqlite-amalgamation-' + sqlite3_version + '.zip'
|
|
||||||
}
|
|
||||||
|
|
||||||
task cleanAll(type: Delete, dependsOn: [clean, cleanAssets, cleanIconv,
|
|
||||||
cleanFreetype, cleanIrrlicht, cleanLevelDB, cleanSQLite3, cleanCURL,
|
|
||||||
cleanOpenSSL, cleanOpenAL, cleanOgg]) {
|
|
||||||
delete 'deps'
|
|
||||||
delete 'gen'
|
|
||||||
delete 'libs'
|
|
||||||
delete 'obj'
|
|
||||||
delete 'bin'
|
|
||||||
delete 'Debug'
|
|
||||||
delete 'and_env'
|
|
||||||
}
|
|
||||||
|
|
||||||
dependencies {
|
|
||||||
implementation 'androidx.core:core:1.1.0'
|
|
||||||
}
|
}
|
||||||
|
@ -1,2 +1,11 @@
|
|||||||
|
<#if isLowMemory>
|
||||||
|
org.gradle.jvmargs=-Xmx4G -XX:MaxPermSize=2G -XX:+HeapDumpOnOutOfMemoryError
|
||||||
|
<#else>
|
||||||
|
org.gradle.jvmargs=-Xmx16G -XX:MaxPermSize=8G -XX:+HeapDumpOnOutOfMemoryError
|
||||||
|
</#if>
|
||||||
|
org.gradle.daemon=true
|
||||||
|
org.gradle.parallel=true
|
||||||
|
org.gradle.parallel.threads=8
|
||||||
|
org.gradle.configureondemand=true
|
||||||
android.enableJetifier=true
|
android.enableJetifier=true
|
||||||
android.useAndroidX=true
|
android.useAndroidX=true
|
BIN
build/android/gradle/wrapper/gradle-wrapper.jar
vendored
BIN
build/android/gradle/wrapper/gradle-wrapper.jar
vendored
Binary file not shown.
@ -1 +1,2 @@
|
|||||||
distributionUrl=https\://services.gradle.org/distributions/gradle-5.6.2-all.zip
|
#Mon Apr 06 00:06:16 CEST 2020
|
||||||
|
distributionUrl=https\://services.gradle.org/distributions/gradle-6.3-all.zip
|
||||||
|
22
build/android/gradlew
vendored
22
build/android/gradlew
vendored
@ -1,5 +1,21 @@
|
|||||||
#!/usr/bin/env sh
|
#!/usr/bin/env sh
|
||||||
|
|
||||||
|
#
|
||||||
|
# Copyright 2015 the original author or authors.
|
||||||
|
#
|
||||||
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
# you may not use this file except in compliance with the License.
|
||||||
|
# You may obtain a copy of the License at
|
||||||
|
#
|
||||||
|
# https://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
#
|
||||||
|
# Unless required by applicable law or agreed to in writing, software
|
||||||
|
# distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
# See the License for the specific language governing permissions and
|
||||||
|
# limitations under the License.
|
||||||
|
#
|
||||||
|
|
||||||
##############################################################################
|
##############################################################################
|
||||||
##
|
##
|
||||||
## Gradle start up script for UN*X
|
## Gradle start up script for UN*X
|
||||||
@ -28,7 +44,7 @@ APP_NAME="Gradle"
|
|||||||
APP_BASE_NAME=`basename "$0"`
|
APP_BASE_NAME=`basename "$0"`
|
||||||
|
|
||||||
# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
|
# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
|
||||||
DEFAULT_JVM_OPTS=""
|
DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"'
|
||||||
|
|
||||||
# Use the maximum available, or set MAX_FD != -1 to use that value.
|
# Use the maximum available, or set MAX_FD != -1 to use that value.
|
||||||
MAX_FD="maximum"
|
MAX_FD="maximum"
|
||||||
@ -109,8 +125,8 @@ if $darwin; then
|
|||||||
GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\""
|
GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\""
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# For Cygwin, switch paths to Windows format before running java
|
# For Cygwin or MSYS, switch paths to Windows format before running java
|
||||||
if $cygwin ; then
|
if [ "$cygwin" = "true" -o "$msys" = "true" ] ; then
|
||||||
APP_HOME=`cygpath --path --mixed "$APP_HOME"`
|
APP_HOME=`cygpath --path --mixed "$APP_HOME"`
|
||||||
CLASSPATH=`cygpath --path --mixed "$CLASSPATH"`
|
CLASSPATH=`cygpath --path --mixed "$CLASSPATH"`
|
||||||
JAVACMD=`cygpath --unix "$JAVACMD"`
|
JAVACMD=`cygpath --unix "$JAVACMD"`
|
||||||
|
18
build/android/gradlew.bat
vendored
18
build/android/gradlew.bat
vendored
@ -1,3 +1,19 @@
|
|||||||
|
@rem
|
||||||
|
@rem Copyright 2015 the original author or authors.
|
||||||
|
@rem
|
||||||
|
@rem Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
@rem you may not use this file except in compliance with the License.
|
||||||
|
@rem You may obtain a copy of the License at
|
||||||
|
@rem
|
||||||
|
@rem https://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
@rem
|
||||||
|
@rem Unless required by applicable law or agreed to in writing, software
|
||||||
|
@rem distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
@rem See the License for the specific language governing permissions and
|
||||||
|
@rem limitations under the License.
|
||||||
|
@rem
|
||||||
|
|
||||||
@if "%DEBUG%" == "" @echo off
|
@if "%DEBUG%" == "" @echo off
|
||||||
@rem ##########################################################################
|
@rem ##########################################################################
|
||||||
@rem
|
@rem
|
||||||
@ -14,7 +30,7 @@ set APP_BASE_NAME=%~n0
|
|||||||
set APP_HOME=%DIRNAME%
|
set APP_HOME=%DIRNAME%
|
||||||
|
|
||||||
@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
|
@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
|
||||||
set DEFAULT_JVM_OPTS=
|
set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m"
|
||||||
|
|
||||||
@rem Find java.exe
|
@rem Find java.exe
|
||||||
if defined JAVA_HOME goto findJavaFromJavaHome
|
if defined JAVA_HOME goto findJavaFromJavaHome
|
||||||
|
@ -1,448 +0,0 @@
|
|||||||
LOCAL_PATH := $(call my-dir)/..
|
|
||||||
|
|
||||||
#LOCAL_ADDRESS_SANITIZER:=true
|
|
||||||
|
|
||||||
include $(CLEAR_VARS)
|
|
||||||
LOCAL_MODULE := Irrlicht
|
|
||||||
LOCAL_SRC_FILES := deps/irrlicht/lib/Android/libIrrlicht.a
|
|
||||||
include $(PREBUILT_STATIC_LIBRARY)
|
|
||||||
|
|
||||||
ifeq ($(HAVE_LEVELDB), 1)
|
|
||||||
include $(CLEAR_VARS)
|
|
||||||
LOCAL_MODULE := LevelDB
|
|
||||||
LOCAL_SRC_FILES := deps/leveldb/libleveldb.a
|
|
||||||
include $(PREBUILT_STATIC_LIBRARY)
|
|
||||||
endif
|
|
||||||
|
|
||||||
include $(CLEAR_VARS)
|
|
||||||
LOCAL_MODULE := curl
|
|
||||||
LOCAL_SRC_FILES := deps/curl/lib/.libs/libcurl.a
|
|
||||||
include $(PREBUILT_STATIC_LIBRARY)
|
|
||||||
|
|
||||||
include $(CLEAR_VARS)
|
|
||||||
LOCAL_MODULE := freetype
|
|
||||||
LOCAL_SRC_FILES := deps/freetype2-android/Android/obj/local/$(TARGET_ARCH_ABI)/libfreetype2-static.a
|
|
||||||
include $(PREBUILT_STATIC_LIBRARY)
|
|
||||||
|
|
||||||
include $(CLEAR_VARS)
|
|
||||||
LOCAL_MODULE := iconv
|
|
||||||
LOCAL_SRC_FILES := deps/libiconv/lib/.libs/libiconv.so
|
|
||||||
include $(PREBUILT_SHARED_LIBRARY)
|
|
||||||
|
|
||||||
include $(CLEAR_VARS)
|
|
||||||
LOCAL_MODULE := openal
|
|
||||||
LOCAL_SRC_FILES := deps/openal-soft/libs/$(TARGET_LIBDIR)/libopenal.so
|
|
||||||
include $(PREBUILT_SHARED_LIBRARY)
|
|
||||||
|
|
||||||
include $(CLEAR_VARS)
|
|
||||||
LOCAL_MODULE := ogg
|
|
||||||
LOCAL_SRC_FILES := deps/libvorbis-libogg-android/libs/$(TARGET_LIBDIR)/libogg.so
|
|
||||||
include $(PREBUILT_SHARED_LIBRARY)
|
|
||||||
|
|
||||||
include $(CLEAR_VARS)
|
|
||||||
LOCAL_MODULE := vorbis
|
|
||||||
LOCAL_SRC_FILES := deps/libvorbis-libogg-android/libs/$(TARGET_LIBDIR)/libvorbis.so
|
|
||||||
include $(PREBUILT_SHARED_LIBRARY)
|
|
||||||
|
|
||||||
include $(CLEAR_VARS)
|
|
||||||
LOCAL_MODULE := ssl
|
|
||||||
LOCAL_SRC_FILES := deps/openssl/libssl.a
|
|
||||||
include $(PREBUILT_STATIC_LIBRARY)
|
|
||||||
|
|
||||||
include $(CLEAR_VARS)
|
|
||||||
LOCAL_MODULE := crypto
|
|
||||||
LOCAL_SRC_FILES := deps/openssl/libcrypto.a
|
|
||||||
include $(PREBUILT_STATIC_LIBRARY)
|
|
||||||
|
|
||||||
include $(CLEAR_VARS)
|
|
||||||
LOCAL_MODULE := minetest
|
|
||||||
|
|
||||||
LOCAL_CPP_FEATURES += exceptions
|
|
||||||
|
|
||||||
ifdef GPROF
|
|
||||||
GPROF_DEF=-DGPROF
|
|
||||||
endif
|
|
||||||
|
|
||||||
LOCAL_CFLAGS := -D_IRR_ANDROID_PLATFORM_ \
|
|
||||||
-DHAVE_TOUCHSCREENGUI \
|
|
||||||
-DENABLE_GLES=1 \
|
|
||||||
-DUSE_CURL=1 \
|
|
||||||
-DUSE_SOUND=1 \
|
|
||||||
-DUSE_FREETYPE=1 \
|
|
||||||
-DUSE_LEVELDB=$(HAVE_LEVELDB) \
|
|
||||||
$(GPROF_DEF) \
|
|
||||||
-pipe -fstrict-aliasing
|
|
||||||
|
|
||||||
ifndef NDEBUG
|
|
||||||
LOCAL_CFLAGS += -g -D_DEBUG -O0 -fno-omit-frame-pointer
|
|
||||||
else
|
|
||||||
LOCAL_CFLAGS += $(TARGET_CFLAGS_ADDON)
|
|
||||||
endif
|
|
||||||
|
|
||||||
ifdef GPROF
|
|
||||||
PROFILER_LIBS := android-ndk-profiler
|
|
||||||
LOCAL_CFLAGS += -pg
|
|
||||||
endif
|
|
||||||
|
|
||||||
# LOCAL_CFLAGS += -fsanitize=address
|
|
||||||
# LOCAL_LDFLAGS += -fsanitize=address
|
|
||||||
|
|
||||||
ifeq ($(TARGET_ABI),x86)
|
|
||||||
LOCAL_CFLAGS += -fno-stack-protector
|
|
||||||
endif
|
|
||||||
|
|
||||||
LOCAL_C_INCLUDES := \
|
|
||||||
jni/src \
|
|
||||||
jni/src/script \
|
|
||||||
jni/lib/gmp \
|
|
||||||
jni/lib/lua/src \
|
|
||||||
jni/lib/jsoncpp \
|
|
||||||
jni/src/cguittfont \
|
|
||||||
deps/irrlicht/include \
|
|
||||||
deps/libiconv/include \
|
|
||||||
deps/freetype2-android/include \
|
|
||||||
deps/curl/include \
|
|
||||||
deps/openal-soft/jni/OpenAL/include \
|
|
||||||
deps/libvorbis-libogg-android/jni/include \
|
|
||||||
deps/leveldb/include \
|
|
||||||
deps/sqlite/
|
|
||||||
|
|
||||||
LOCAL_SRC_FILES := \
|
|
||||||
jni/src/ban.cpp \
|
|
||||||
jni/src/chat.cpp \
|
|
||||||
jni/src/client/activeobjectmgr.cpp \
|
|
||||||
jni/src/client/camera.cpp \
|
|
||||||
jni/src/client/client.cpp \
|
|
||||||
jni/src/client/clientenvironment.cpp \
|
|
||||||
jni/src/client/clientlauncher.cpp \
|
|
||||||
jni/src/client/clientmap.cpp \
|
|
||||||
jni/src/client/clientmedia.cpp \
|
|
||||||
jni/src/client/clientobject.cpp \
|
|
||||||
jni/src/client/clouds.cpp \
|
|
||||||
jni/src/client/content_cao.cpp \
|
|
||||||
jni/src/client/content_cso.cpp \
|
|
||||||
jni/src/client/content_mapblock.cpp \
|
|
||||||
jni/src/client/filecache.cpp \
|
|
||||||
jni/src/client/fontengine.cpp \
|
|
||||||
jni/src/client/game.cpp \
|
|
||||||
jni/src/client/gameui.cpp \
|
|
||||||
jni/src/client/guiscalingfilter.cpp \
|
|
||||||
jni/src/client/hud.cpp \
|
|
||||||
jni/src/clientiface.cpp \
|
|
||||||
jni/src/client/imagefilters.cpp \
|
|
||||||
jni/src/client/inputhandler.cpp \
|
|
||||||
jni/src/client/joystick_controller.cpp \
|
|
||||||
jni/src/client/keycode.cpp \
|
|
||||||
jni/src/client/localplayer.cpp \
|
|
||||||
jni/src/client/mapblock_mesh.cpp \
|
|
||||||
jni/src/client/mesh.cpp \
|
|
||||||
jni/src/client/meshgen/collector.cpp \
|
|
||||||
jni/src/client/mesh_generator_thread.cpp \
|
|
||||||
jni/src/client/minimap.cpp \
|
|
||||||
jni/src/client/particles.cpp \
|
|
||||||
jni/src/client/render/anaglyph.cpp \
|
|
||||||
jni/src/client/render/core.cpp \
|
|
||||||
jni/src/client/render/factory.cpp \
|
|
||||||
jni/src/client/renderingengine.cpp \
|
|
||||||
jni/src/client/render/interlaced.cpp \
|
|
||||||
jni/src/client/render/pageflip.cpp \
|
|
||||||
jni/src/client/render/plain.cpp \
|
|
||||||
jni/src/client/render/sidebyside.cpp \
|
|
||||||
jni/src/client/render/stereo.cpp \
|
|
||||||
jni/src/client/shader.cpp \
|
|
||||||
jni/src/client/sky.cpp \
|
|
||||||
jni/src/client/sound.cpp \
|
|
||||||
jni/src/client/sound_openal.cpp \
|
|
||||||
jni/src/client/tile.cpp \
|
|
||||||
jni/src/client/wieldmesh.cpp \
|
|
||||||
jni/src/collision.cpp \
|
|
||||||
jni/src/content/content.cpp \
|
|
||||||
jni/src/content_mapnode.cpp \
|
|
||||||
jni/src/content/mods.cpp \
|
|
||||||
jni/src/content_nodemeta.cpp \
|
|
||||||
jni/src/content/packages.cpp \
|
|
||||||
jni/src/content/subgames.cpp \
|
|
||||||
jni/src/convert_json.cpp \
|
|
||||||
jni/src/craftdef.cpp \
|
|
||||||
jni/src/database/database.cpp \
|
|
||||||
jni/src/database/database-dummy.cpp \
|
|
||||||
jni/src/database/database-files.cpp \
|
|
||||||
jni/src/database/database-leveldb.cpp \
|
|
||||||
jni/src/database/database-sqlite3.cpp \
|
|
||||||
jni/src/debug.cpp \
|
|
||||||
jni/src/defaultsettings.cpp \
|
|
||||||
jni/src/emerge.cpp \
|
|
||||||
jni/src/environment.cpp \
|
|
||||||
jni/src/face_position_cache.cpp \
|
|
||||||
jni/src/filesys.cpp \
|
|
||||||
jni/src/gettext.cpp \
|
|
||||||
jni/src/gui/guiAnimatedImage.cpp \
|
|
||||||
jni/src/gui/guiBackgroundImage.cpp \
|
|
||||||
jni/src/gui/guiBox.cpp \
|
|
||||||
jni/src/gui/guiButton.cpp \
|
|
||||||
jni/src/gui/guiButtonImage.cpp \
|
|
||||||
jni/src/gui/guiButtonItemImage.cpp \
|
|
||||||
jni/src/gui/guiChatConsole.cpp \
|
|
||||||
jni/src/gui/guiConfirmRegistration.cpp \
|
|
||||||
jni/src/gui/guiEditBoxWithScrollbar.cpp \
|
|
||||||
jni/src/gui/guiEngine.cpp \
|
|
||||||
jni/src/gui/guiFormSpecMenu.cpp \
|
|
||||||
jni/src/gui/guiHyperText.cpp \
|
|
||||||
jni/src/gui/guiInventoryList.cpp \
|
|
||||||
jni/src/gui/guiItemImage.cpp \
|
|
||||||
jni/src/gui/guiKeyChangeMenu.cpp \
|
|
||||||
jni/src/gui/guiPasswordChange.cpp \
|
|
||||||
jni/src/gui/guiPathSelectMenu.cpp \
|
|
||||||
jni/src/gui/guiScrollBar.cpp \
|
|
||||||
jni/src/gui/guiScrollContainer.cpp \
|
|
||||||
jni/src/gui/guiSkin.cpp \
|
|
||||||
jni/src/gui/guiTable.cpp \
|
|
||||||
jni/src/gui/guiVolumeChange.cpp \
|
|
||||||
jni/src/gui/intlGUIEditBox.cpp \
|
|
||||||
jni/src/gui/modalMenu.cpp \
|
|
||||||
jni/src/gui/profilergraph.cpp \
|
|
||||||
jni/src/gui/touchscreengui.cpp \
|
|
||||||
jni/src/httpfetch.cpp \
|
|
||||||
jni/src/hud.cpp \
|
|
||||||
jni/src/inventory.cpp \
|
|
||||||
jni/src/inventorymanager.cpp \
|
|
||||||
jni/src/irrlicht_changes/CGUITTFont.cpp \
|
|
||||||
jni/src/irrlicht_changes/static_text.cpp \
|
|
||||||
jni/src/itemdef.cpp \
|
|
||||||
jni/src/itemstackmetadata.cpp \
|
|
||||||
jni/src/light.cpp \
|
|
||||||
jni/src/log.cpp \
|
|
||||||
jni/src/main.cpp \
|
|
||||||
jni/src/mapblock.cpp \
|
|
||||||
jni/src/map.cpp \
|
|
||||||
jni/src/mapgen/cavegen.cpp \
|
|
||||||
jni/src/mapgen/dungeongen.cpp \
|
|
||||||
jni/src/mapgen/mapgen_carpathian.cpp \
|
|
||||||
jni/src/mapgen/mapgen.cpp \
|
|
||||||
jni/src/mapgen/mapgen_flat.cpp \
|
|
||||||
jni/src/mapgen/mapgen_fractal.cpp \
|
|
||||||
jni/src/mapgen/mapgen_singlenode.cpp \
|
|
||||||
jni/src/mapgen/mapgen_v5.cpp \
|
|
||||||
jni/src/mapgen/mapgen_v6.cpp \
|
|
||||||
jni/src/mapgen/mapgen_v7.cpp \
|
|
||||||
jni/src/mapgen/mapgen_valleys.cpp \
|
|
||||||
jni/src/mapgen/mg_biome.cpp \
|
|
||||||
jni/src/mapgen/mg_decoration.cpp \
|
|
||||||
jni/src/mapgen/mg_ore.cpp \
|
|
||||||
jni/src/mapgen/mg_schematic.cpp \
|
|
||||||
jni/src/mapgen/treegen.cpp \
|
|
||||||
jni/src/mapnode.cpp \
|
|
||||||
jni/src/mapsector.cpp \
|
|
||||||
jni/src/map_settings_manager.cpp \
|
|
||||||
jni/src/metadata.cpp \
|
|
||||||
jni/src/modchannels.cpp \
|
|
||||||
jni/src/nameidmapping.cpp \
|
|
||||||
jni/src/nodedef.cpp \
|
|
||||||
jni/src/nodemetadata.cpp \
|
|
||||||
jni/src/nodetimer.cpp \
|
|
||||||
jni/src/noise.cpp \
|
|
||||||
jni/src/objdef.cpp \
|
|
||||||
jni/src/object_properties.cpp \
|
|
||||||
jni/src/pathfinder.cpp \
|
|
||||||
jni/src/player.cpp \
|
|
||||||
jni/src/porting_android.cpp \
|
|
||||||
jni/src/porting.cpp \
|
|
||||||
jni/src/profiler.cpp \
|
|
||||||
jni/src/raycast.cpp \
|
|
||||||
jni/src/reflowscan.cpp \
|
|
||||||
jni/src/remoteplayer.cpp \
|
|
||||||
jni/src/rollback.cpp \
|
|
||||||
jni/src/rollback_interface.cpp \
|
|
||||||
jni/src/serialization.cpp \
|
|
||||||
jni/src/server/activeobjectmgr.cpp \
|
|
||||||
jni/src/server.cpp \
|
|
||||||
jni/src/serverenvironment.cpp \
|
|
||||||
jni/src/serverlist.cpp \
|
|
||||||
jni/src/server/luaentity_sao.cpp \
|
|
||||||
jni/src/server/mods.cpp \
|
|
||||||
jni/src/server/player_sao.cpp \
|
|
||||||
jni/src/server/serveractiveobject.cpp \
|
|
||||||
jni/src/server/unit_sao.cpp \
|
|
||||||
jni/src/settings.cpp \
|
|
||||||
jni/src/staticobject.cpp \
|
|
||||||
jni/src/tileanimation.cpp \
|
|
||||||
jni/src/tool.cpp \
|
|
||||||
jni/src/translation.cpp \
|
|
||||||
jni/src/unittest/test_authdatabase.cpp \
|
|
||||||
jni/src/unittest/test_collision.cpp \
|
|
||||||
jni/src/unittest/test_compression.cpp \
|
|
||||||
jni/src/unittest/test_connection.cpp \
|
|
||||||
jni/src/unittest/test.cpp \
|
|
||||||
jni/src/unittest/test_filepath.cpp \
|
|
||||||
jni/src/unittest/test_gameui.cpp \
|
|
||||||
jni/src/unittest/test_inventory.cpp \
|
|
||||||
jni/src/unittest/test_mapnode.cpp \
|
|
||||||
jni/src/unittest/test_map_settings_manager.cpp \
|
|
||||||
jni/src/unittest/test_nodedef.cpp \
|
|
||||||
jni/src/unittest/test_noderesolver.cpp \
|
|
||||||
jni/src/unittest/test_noise.cpp \
|
|
||||||
jni/src/unittest/test_objdef.cpp \
|
|
||||||
jni/src/unittest/test_profiler.cpp \
|
|
||||||
jni/src/unittest/test_random.cpp \
|
|
||||||
jni/src/unittest/test_schematic.cpp \
|
|
||||||
jni/src/unittest/test_serialization.cpp \
|
|
||||||
jni/src/unittest/test_settings.cpp \
|
|
||||||
jni/src/unittest/test_socket.cpp \
|
|
||||||
jni/src/unittest/test_utilities.cpp \
|
|
||||||
jni/src/unittest/test_voxelalgorithms.cpp \
|
|
||||||
jni/src/unittest/test_voxelmanipulator.cpp \
|
|
||||||
jni/src/util/areastore.cpp \
|
|
||||||
jni/src/util/auth.cpp \
|
|
||||||
jni/src/util/base64.cpp \
|
|
||||||
jni/src/util/directiontables.cpp \
|
|
||||||
jni/src/util/enriched_string.cpp \
|
|
||||||
jni/src/util/ieee_float.cpp \
|
|
||||||
jni/src/util/numeric.cpp \
|
|
||||||
jni/src/util/pointedthing.cpp \
|
|
||||||
jni/src/util/quicktune.cpp \
|
|
||||||
jni/src/util/serialize.cpp \
|
|
||||||
jni/src/util/sha1.cpp \
|
|
||||||
jni/src/util/srp.cpp \
|
|
||||||
jni/src/util/string.cpp \
|
|
||||||
jni/src/util/timetaker.cpp \
|
|
||||||
jni/src/version.cpp \
|
|
||||||
jni/src/voxelalgorithms.cpp \
|
|
||||||
jni/src/voxel.cpp
|
|
||||||
|
|
||||||
|
|
||||||
# intentionally kept out (we already build openssl itself): jni/src/util/sha256.c
|
|
||||||
|
|
||||||
# Network
|
|
||||||
LOCAL_SRC_FILES += \
|
|
||||||
jni/src/network/address.cpp \
|
|
||||||
jni/src/network/connection.cpp \
|
|
||||||
jni/src/network/networkpacket.cpp \
|
|
||||||
jni/src/network/clientopcodes.cpp \
|
|
||||||
jni/src/network/clientpackethandler.cpp \
|
|
||||||
jni/src/network/connectionthreads.cpp \
|
|
||||||
jni/src/network/serveropcodes.cpp \
|
|
||||||
jni/src/network/serverpackethandler.cpp \
|
|
||||||
jni/src/network/socket.cpp \
|
|
||||||
|
|
||||||
# lua api
|
|
||||||
LOCAL_SRC_FILES += \
|
|
||||||
jni/src/script/common/c_content.cpp \
|
|
||||||
jni/src/script/common/c_converter.cpp \
|
|
||||||
jni/src/script/common/c_internal.cpp \
|
|
||||||
jni/src/script/common/c_types.cpp \
|
|
||||||
jni/src/script/common/helper.cpp \
|
|
||||||
jni/src/script/cpp_api/s_async.cpp \
|
|
||||||
jni/src/script/cpp_api/s_base.cpp \
|
|
||||||
jni/src/script/cpp_api/s_client.cpp \
|
|
||||||
jni/src/script/cpp_api/s_entity.cpp \
|
|
||||||
jni/src/script/cpp_api/s_env.cpp \
|
|
||||||
jni/src/script/cpp_api/s_inventory.cpp \
|
|
||||||
jni/src/script/cpp_api/s_item.cpp \
|
|
||||||
jni/src/script/cpp_api/s_mainmenu.cpp \
|
|
||||||
jni/src/script/cpp_api/s_modchannels.cpp \
|
|
||||||
jni/src/script/cpp_api/s_node.cpp \
|
|
||||||
jni/src/script/cpp_api/s_nodemeta.cpp \
|
|
||||||
jni/src/script/cpp_api/s_player.cpp \
|
|
||||||
jni/src/script/cpp_api/s_security.cpp \
|
|
||||||
jni/src/script/cpp_api/s_server.cpp \
|
|
||||||
jni/src/script/lua_api/l_areastore.cpp \
|
|
||||||
jni/src/script/lua_api/l_auth.cpp \
|
|
||||||
jni/src/script/lua_api/l_base.cpp \
|
|
||||||
jni/src/script/lua_api/l_camera.cpp \
|
|
||||||
jni/src/script/lua_api/l_client.cpp \
|
|
||||||
jni/src/script/lua_api/l_craft.cpp \
|
|
||||||
jni/src/script/lua_api/l_env.cpp \
|
|
||||||
jni/src/script/lua_api/l_inventory.cpp \
|
|
||||||
jni/src/script/lua_api/l_item.cpp \
|
|
||||||
jni/src/script/lua_api/l_itemstackmeta.cpp\
|
|
||||||
jni/src/script/lua_api/l_localplayer.cpp \
|
|
||||||
jni/src/script/lua_api/l_mainmenu.cpp \
|
|
||||||
jni/src/script/lua_api/l_mapgen.cpp \
|
|
||||||
jni/src/script/lua_api/l_metadata.cpp \
|
|
||||||
jni/src/script/lua_api/l_minimap.cpp \
|
|
||||||
jni/src/script/lua_api/l_modchannels.cpp \
|
|
||||||
jni/src/script/lua_api/l_nodemeta.cpp \
|
|
||||||
jni/src/script/lua_api/l_nodetimer.cpp \
|
|
||||||
jni/src/script/lua_api/l_noise.cpp \
|
|
||||||
jni/src/script/lua_api/l_object.cpp \
|
|
||||||
jni/src/script/lua_api/l_playermeta.cpp \
|
|
||||||
jni/src/script/lua_api/l_particles.cpp \
|
|
||||||
jni/src/script/lua_api/l_particles_local.cpp\
|
|
||||||
jni/src/script/lua_api/l_rollback.cpp \
|
|
||||||
jni/src/script/lua_api/l_server.cpp \
|
|
||||||
jni/src/script/lua_api/l_settings.cpp \
|
|
||||||
jni/src/script/lua_api/l_sound.cpp \
|
|
||||||
jni/src/script/lua_api/l_http.cpp \
|
|
||||||
jni/src/script/lua_api/l_storage.cpp \
|
|
||||||
jni/src/script/lua_api/l_util.cpp \
|
|
||||||
jni/src/script/lua_api/l_vmanip.cpp \
|
|
||||||
jni/src/script/scripting_client.cpp \
|
|
||||||
jni/src/script/scripting_server.cpp \
|
|
||||||
jni/src/script/scripting_mainmenu.cpp
|
|
||||||
|
|
||||||
#freetype2 support
|
|
||||||
#LOCAL_SRC_FILES += jni/src/cguittfont/xCGUITTFont.cpp
|
|
||||||
|
|
||||||
# GMP
|
|
||||||
LOCAL_SRC_FILES += jni/lib/gmp/mini-gmp.c
|
|
||||||
|
|
||||||
# Lua
|
|
||||||
LOCAL_SRC_FILES += \
|
|
||||||
jni/lib/lua/src/lapi.c \
|
|
||||||
jni/lib/lua/src/lauxlib.c \
|
|
||||||
jni/lib/lua/src/lbaselib.c \
|
|
||||||
jni/lib/lua/src/lcode.c \
|
|
||||||
jni/lib/lua/src/ldblib.c \
|
|
||||||
jni/lib/lua/src/ldebug.c \
|
|
||||||
jni/lib/lua/src/ldo.c \
|
|
||||||
jni/lib/lua/src/ldump.c \
|
|
||||||
jni/lib/lua/src/lfunc.c \
|
|
||||||
jni/lib/lua/src/lgc.c \
|
|
||||||
jni/lib/lua/src/linit.c \
|
|
||||||
jni/lib/lua/src/liolib.c \
|
|
||||||
jni/lib/lua/src/llex.c \
|
|
||||||
jni/lib/lua/src/lmathlib.c \
|
|
||||||
jni/lib/lua/src/lmem.c \
|
|
||||||
jni/lib/lua/src/loadlib.c \
|
|
||||||
jni/lib/lua/src/lobject.c \
|
|
||||||
jni/lib/lua/src/lopcodes.c \
|
|
||||||
jni/lib/lua/src/loslib.c \
|
|
||||||
jni/lib/lua/src/lparser.c \
|
|
||||||
jni/lib/lua/src/lstate.c \
|
|
||||||
jni/lib/lua/src/lstring.c \
|
|
||||||
jni/lib/lua/src/lstrlib.c \
|
|
||||||
jni/lib/lua/src/ltable.c \
|
|
||||||
jni/lib/lua/src/ltablib.c \
|
|
||||||
jni/lib/lua/src/ltm.c \
|
|
||||||
jni/lib/lua/src/lundump.c \
|
|
||||||
jni/lib/lua/src/lvm.c \
|
|
||||||
jni/lib/lua/src/lzio.c \
|
|
||||||
jni/lib/lua/src/print.c
|
|
||||||
|
|
||||||
# SQLite3
|
|
||||||
LOCAL_SRC_FILES += deps/sqlite/sqlite3.c
|
|
||||||
|
|
||||||
# Threading
|
|
||||||
LOCAL_SRC_FILES += \
|
|
||||||
jni/src/threading/event.cpp \
|
|
||||||
jni/src/threading/semaphore.cpp \
|
|
||||||
jni/src/threading/thread.cpp
|
|
||||||
|
|
||||||
# JSONCPP
|
|
||||||
LOCAL_SRC_FILES += jni/lib/jsoncpp/jsoncpp.cpp
|
|
||||||
|
|
||||||
LOCAL_SHARED_LIBRARIES := iconv openal ogg vorbis
|
|
||||||
LOCAL_STATIC_LIBRARIES := Irrlicht freetype curl ssl crypto android_native_app_glue $(PROFILER_LIBS)
|
|
||||||
|
|
||||||
ifeq ($(HAVE_LEVELDB), 1)
|
|
||||||
LOCAL_STATIC_LIBRARIES += LevelDB
|
|
||||||
endif
|
|
||||||
LOCAL_LDLIBS := -lEGL -llog -lGLESv1_CM -lGLESv2 -lz -landroid
|
|
||||||
|
|
||||||
include $(BUILD_SHARED_LIBRARY)
|
|
||||||
|
|
||||||
# at the end of Android.mk
|
|
||||||
ifdef GPROF
|
|
||||||
$(call import-module,android-ndk-profiler)
|
|
||||||
endif
|
|
||||||
$(call import-module,android/native_app_glue)
|
|
@ -1,9 +0,0 @@
|
|||||||
APP_PLATFORM := ${APP_PLATFORM}
|
|
||||||
APP_ABI := ${TARGET_ABI}
|
|
||||||
APP_STL := c++_shared
|
|
||||||
APP_MODULES := minetest
|
|
||||||
ifndef NDEBUG
|
|
||||||
APP_OPTIM := debug
|
|
||||||
endif
|
|
||||||
|
|
||||||
APP_CPPFLAGS += -fexceptions -std=c++11 -frtti
|
|
@ -1,7 +0,0 @@
|
|||||||
APP_PLATFORM := ${APP_PLATFORM}
|
|
||||||
APP_ABI := ${TARGET_ABI}
|
|
||||||
APP_STL := c++_shared
|
|
||||||
APP_DEPRECATED_HEADERS := true
|
|
||||||
|
|
||||||
APP_CFLAGS += ${TARGET_CFLAGS_ADDON}
|
|
||||||
APP_CPPFLAGS += ${TARGET_CXXFLAGS_ADDON} -fexceptions -std=c++11
|
|
@ -1,8 +0,0 @@
|
|||||||
APP_PLATFORM := ${APP_PLATFORM}
|
|
||||||
APP_ABI := ${TARGET_ABI}
|
|
||||||
APP_STL := c++_shared
|
|
||||||
APP_DEPRECATED_HEADERS := true
|
|
||||||
APP_MODULES := Irrlicht
|
|
||||||
|
|
||||||
APP_CLAFGS += ${TARGET_CFLAGS_ADDON}
|
|
||||||
APP_CPPFLAGS += ${TARGET_CXXFLAGS_ADDON} -fexceptions
|
|
59
build/android/native/build.gradle
Normal file
59
build/android/native/build.gradle
Normal file
@ -0,0 +1,59 @@
|
|||||||
|
apply plugin: 'com.android.library'
|
||||||
|
import org.ajoberstar.grgit.Grgit
|
||||||
|
|
||||||
|
android {
|
||||||
|
compileSdkVersion 29
|
||||||
|
buildToolsVersion '29.0.3'
|
||||||
|
ndkVersion '21.0.6113669'
|
||||||
|
defaultConfig {
|
||||||
|
minSdkVersion 16
|
||||||
|
targetSdkVersion 29
|
||||||
|
externalNativeBuild {
|
||||||
|
ndkBuild {
|
||||||
|
arguments '-j8',
|
||||||
|
"versionMajor=${versionMajor}",
|
||||||
|
"versionMinor=${versionMinor}",
|
||||||
|
"versionPatch=${versionPatch}",
|
||||||
|
"versionExtra=${versionExtra}"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
externalNativeBuild {
|
||||||
|
ndkBuild {
|
||||||
|
path file('jni/Android.mk')
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// supported architectures
|
||||||
|
splits {
|
||||||
|
abi {
|
||||||
|
enable true
|
||||||
|
reset()
|
||||||
|
include 'armeabi-v7a', 'arm64-v8a'//, 'x86'
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
buildTypes {
|
||||||
|
release {
|
||||||
|
externalNativeBuild {
|
||||||
|
ndkBuild {
|
||||||
|
arguments 'NDEBUG=1'
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
task cloneGitRepo() {
|
||||||
|
def destination = file('deps')
|
||||||
|
if(!destination.exists()) {
|
||||||
|
def grgit = Grgit.clone(
|
||||||
|
dir: destination,
|
||||||
|
uri: 'https://github.com/minetest/minetest_android_deps_binaries'
|
||||||
|
)
|
||||||
|
grgit.close()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
preBuild.dependsOn cloneGitRepo
|
218
build/android/native/jni/Android.mk
Normal file
218
build/android/native/jni/Android.mk
Normal file
@ -0,0 +1,218 @@
|
|||||||
|
LOCAL_PATH := $(call my-dir)/..
|
||||||
|
|
||||||
|
#LOCAL_ADDRESS_SANITIZER:=true
|
||||||
|
|
||||||
|
include $(CLEAR_VARS)
|
||||||
|
LOCAL_MODULE := Curl
|
||||||
|
LOCAL_SRC_FILES := deps/Android/Curl/${NDK_TOOLCHAIN_VERSION}/$(APP_ABI)/libcurl.a
|
||||||
|
include $(PREBUILT_STATIC_LIBRARY)
|
||||||
|
|
||||||
|
include $(CLEAR_VARS)
|
||||||
|
LOCAL_MODULE := Freetype
|
||||||
|
LOCAL_SRC_FILES := deps/Android/Freetype/${NDK_TOOLCHAIN_VERSION}/$(APP_ABI)/libfreetype.a
|
||||||
|
include $(PREBUILT_STATIC_LIBRARY)
|
||||||
|
|
||||||
|
include $(CLEAR_VARS)
|
||||||
|
LOCAL_MODULE := Irrlicht
|
||||||
|
LOCAL_SRC_FILES := deps/Android/Irrlicht/${NDK_TOOLCHAIN_VERSION}/$(APP_ABI)/libIrrlicht.a
|
||||||
|
include $(PREBUILT_STATIC_LIBRARY)
|
||||||
|
|
||||||
|
#include $(CLEAR_VARS)
|
||||||
|
#LOCAL_MODULE := LevelDB
|
||||||
|
#LOCAL_SRC_FILES := deps/Android/LevelDB/${NDK_TOOLCHAIN_VERSION}/$(APP_ABI)/libleveldb.a
|
||||||
|
#include $(PREBUILT_STATIC_LIBRARY)
|
||||||
|
|
||||||
|
include $(CLEAR_VARS)
|
||||||
|
LOCAL_MODULE := LuaJIT
|
||||||
|
LOCAL_SRC_FILES := deps/Android/LuaJIT/${NDK_TOOLCHAIN_VERSION}/$(APP_ABI)/libluajit.a
|
||||||
|
include $(PREBUILT_STATIC_LIBRARY)
|
||||||
|
|
||||||
|
include $(CLEAR_VARS)
|
||||||
|
LOCAL_MODULE := mbedTLS
|
||||||
|
LOCAL_SRC_FILES := deps/Android/mbedTLS/${NDK_TOOLCHAIN_VERSION}/$(APP_ABI)/libmbedtls.a
|
||||||
|
include $(PREBUILT_STATIC_LIBRARY)
|
||||||
|
|
||||||
|
include $(CLEAR_VARS)
|
||||||
|
LOCAL_MODULE := mbedx509
|
||||||
|
LOCAL_SRC_FILES := deps/Android/mbedTLS/${NDK_TOOLCHAIN_VERSION}/$(APP_ABI)/libmbedx509.a
|
||||||
|
include $(PREBUILT_STATIC_LIBRARY)
|
||||||
|
|
||||||
|
include $(CLEAR_VARS)
|
||||||
|
LOCAL_MODULE := mbedcrypto
|
||||||
|
LOCAL_SRC_FILES := deps/Android/mbedTLS/${NDK_TOOLCHAIN_VERSION}/$(APP_ABI)/libmbedcrypto.a
|
||||||
|
include $(PREBUILT_STATIC_LIBRARY)
|
||||||
|
|
||||||
|
include $(CLEAR_VARS)
|
||||||
|
LOCAL_MODULE := OpenAL
|
||||||
|
LOCAL_SRC_FILES := deps/Android/OpenAL-Soft/${NDK_TOOLCHAIN_VERSION}/$(APP_ABI)/libopenal.a
|
||||||
|
include $(PREBUILT_STATIC_LIBRARY)
|
||||||
|
|
||||||
|
# You can use `OpenSSL and Crypto` instead `mbedTLS mbedx509 mbedcrypto`,
|
||||||
|
#but it increase APK size on ~0.7MB
|
||||||
|
#include $(CLEAR_VARS)
|
||||||
|
#LOCAL_MODULE := OpenSSL
|
||||||
|
#LOCAL_SRC_FILES := deps/Android/OpenSSL/${NDK_TOOLCHAIN_VERSION}/$(APP_ABI)/libssl.a
|
||||||
|
#include $(PREBUILT_STATIC_LIBRARY)
|
||||||
|
|
||||||
|
#include $(CLEAR_VARS)
|
||||||
|
#LOCAL_MODULE := Crypto
|
||||||
|
#LOCAL_SRC_FILES := deps/Android/OpenSSL/${NDK_TOOLCHAIN_VERSION}/$(APP_ABI)/libcrypto.a
|
||||||
|
#include $(PREBUILT_STATIC_LIBRARY)
|
||||||
|
|
||||||
|
include $(CLEAR_VARS)
|
||||||
|
LOCAL_MODULE := Vorbis
|
||||||
|
LOCAL_SRC_FILES := deps/Android/Vorbis/${NDK_TOOLCHAIN_VERSION}/$(APP_ABI)/libvorbis.a
|
||||||
|
include $(PREBUILT_STATIC_LIBRARY)
|
||||||
|
|
||||||
|
include $(CLEAR_VARS)
|
||||||
|
LOCAL_MODULE := Minetest
|
||||||
|
|
||||||
|
LOCAL_CFLAGS += \
|
||||||
|
-DJSONCPP_NO_LOCALE_SUPPORT \
|
||||||
|
-DHAVE_TOUCHSCREENGUI \
|
||||||
|
-DENABLE_GLES=1 \
|
||||||
|
-DUSE_CURL=1 \
|
||||||
|
-DUSE_SOUND=1 \
|
||||||
|
-DUSE_FREETYPE=1 \
|
||||||
|
-DUSE_LEVELDB=0 \
|
||||||
|
-DUSE_LUAJIT=1 \
|
||||||
|
-DVERSION_MAJOR=${versionMajor} \
|
||||||
|
-DVERSION_MINOR=${versionMinor} \
|
||||||
|
-DVERSION_PATCH=${versionPatch} \
|
||||||
|
-DVERSION_EXTRA=${versionExtra} \
|
||||||
|
$(GPROF_DEF)
|
||||||
|
|
||||||
|
ifdef NDEBUG
|
||||||
|
LOCAL_CFLAGS += -DNDEBUG=1
|
||||||
|
endif
|
||||||
|
|
||||||
|
ifdef GPROF
|
||||||
|
GPROF_DEF := -DGPROF
|
||||||
|
PROFILER_LIBS := android-ndk-profiler
|
||||||
|
LOCAL_CFLAGS += -pg
|
||||||
|
endif
|
||||||
|
|
||||||
|
LOCAL_C_INCLUDES := \
|
||||||
|
../../../src \
|
||||||
|
../../../src/script \
|
||||||
|
../../../lib/gmp \
|
||||||
|
../../../lib/jsoncpp \
|
||||||
|
deps/Android/Curl/include \
|
||||||
|
deps/Android/Freetype/include \
|
||||||
|
deps/Android/Irrlicht/include \
|
||||||
|
deps/Android/LevelDB/include \
|
||||||
|
deps/Android/libiconv/include \
|
||||||
|
deps/Android/libiconv/libcharset/include \
|
||||||
|
deps/Android/LuaJIT/src \
|
||||||
|
deps/Android/OpenAL-Soft/include \
|
||||||
|
deps/Android/sqlite \
|
||||||
|
deps/Android/Vorbis/include
|
||||||
|
|
||||||
|
LOCAL_SRC_FILES := \
|
||||||
|
$(wildcard ../../../src/client/*.cpp) \
|
||||||
|
$(wildcard ../../../src/client/*/*.cpp) \
|
||||||
|
$(wildcard ../../../src/content/*.cpp) \
|
||||||
|
../../../src/database/database.cpp \
|
||||||
|
../../../src/database/database-dummy.cpp \
|
||||||
|
../../../src/database/database-files.cpp \
|
||||||
|
../../../src/database/database-sqlite3.cpp \
|
||||||
|
$(wildcard ../../../src/gui/*.cpp) \
|
||||||
|
$(wildcard ../../../src/irrlicht_changes/*.cpp) \
|
||||||
|
$(wildcard ../../../src/mapgen/*.cpp) \
|
||||||
|
$(wildcard ../../../src/network/*.cpp) \
|
||||||
|
$(wildcard ../../../src/script/*.cpp) \
|
||||||
|
$(wildcard ../../../src/script/*/*.cpp) \
|
||||||
|
$(wildcard ../../../src/server/*.cpp) \
|
||||||
|
$(wildcard ../../../src/threading/*.cpp) \
|
||||||
|
$(wildcard ../../../src/util/*.c) \
|
||||||
|
$(wildcard ../../../src/util/*.cpp) \
|
||||||
|
../../../src/ban.cpp \
|
||||||
|
../../../src/chat.cpp \
|
||||||
|
../../../src/clientiface.cpp \
|
||||||
|
../../../src/collision.cpp \
|
||||||
|
../../../src/content_mapnode.cpp \
|
||||||
|
../../../src/content_nodemeta.cpp \
|
||||||
|
../../../src/convert_json.cpp \
|
||||||
|
../../../src/craftdef.cpp \
|
||||||
|
../../../src/debug.cpp \
|
||||||
|
../../../src/defaultsettings.cpp \
|
||||||
|
../../../src/emerge.cpp \
|
||||||
|
../../../src/environment.cpp \
|
||||||
|
../../../src/face_position_cache.cpp \
|
||||||
|
../../../src/filesys.cpp \
|
||||||
|
../../../src/gettext.cpp \
|
||||||
|
../../../src/httpfetch.cpp \
|
||||||
|
../../../src/hud.cpp \
|
||||||
|
../../../src/inventory.cpp \
|
||||||
|
../../../src/inventorymanager.cpp \
|
||||||
|
../../../src/itemdef.cpp \
|
||||||
|
../../../src/itemstackmetadata.cpp \
|
||||||
|
../../../src/light.cpp \
|
||||||
|
../../../src/log.cpp \
|
||||||
|
../../../src/main.cpp \
|
||||||
|
../../../src/map.cpp \
|
||||||
|
../../../src/map_settings_manager.cpp \
|
||||||
|
../../../src/mapblock.cpp \
|
||||||
|
../../../src/mapnode.cpp \
|
||||||
|
../../../src/mapsector.cpp \
|
||||||
|
../../../src/metadata.cpp \
|
||||||
|
../../../src/modchannels.cpp \
|
||||||
|
../../../src/nameidmapping.cpp \
|
||||||
|
../../../src/nodedef.cpp \
|
||||||
|
../../../src/nodemetadata.cpp \
|
||||||
|
../../../src/nodetimer.cpp \
|
||||||
|
../../../src/noise.cpp \
|
||||||
|
../../../src/objdef.cpp \
|
||||||
|
../../../src/object_properties.cpp \
|
||||||
|
../../../src/pathfinder.cpp \
|
||||||
|
../../../src/player.cpp \
|
||||||
|
../../../src/porting.cpp \
|
||||||
|
../../../src/porting_android.cpp \
|
||||||
|
../../../src/profiler.cpp \
|
||||||
|
../../../src/raycast.cpp \
|
||||||
|
../../../src/reflowscan.cpp \
|
||||||
|
../../../src/remoteplayer.cpp \
|
||||||
|
../../../src/rollback.cpp \
|
||||||
|
../../../src/rollback_interface.cpp \
|
||||||
|
../../../src/serialization.cpp \
|
||||||
|
../../../src/server.cpp \
|
||||||
|
../../../src/serverenvironment.cpp \
|
||||||
|
../../../src/serverlist.cpp \
|
||||||
|
../../../src/settings.cpp \
|
||||||
|
../../../src/staticobject.cpp \
|
||||||
|
../../../src/texture_override.cpp \
|
||||||
|
../../../src/tileanimation.cpp \
|
||||||
|
../../../src/tool.cpp \
|
||||||
|
../../../src/translation.cpp \
|
||||||
|
../../../src/version.cpp \
|
||||||
|
../../../src/voxel.cpp \
|
||||||
|
../../../src/voxelalgorithms.cpp
|
||||||
|
|
||||||
|
# LevelDB backend is disabled
|
||||||
|
# ../../../src/database/database-leveldb.cpp
|
||||||
|
|
||||||
|
# GMP
|
||||||
|
LOCAL_SRC_FILES += ../../../lib/gmp/mini-gmp.c
|
||||||
|
|
||||||
|
# JSONCPP
|
||||||
|
LOCAL_SRC_FILES += ../../../lib/jsoncpp/jsoncpp.cpp
|
||||||
|
|
||||||
|
# iconv
|
||||||
|
LOCAL_SRC_FILES += \
|
||||||
|
deps/Android/libiconv/lib/iconv.c \
|
||||||
|
deps/Android/libiconv/libcharset/lib/localcharset.c
|
||||||
|
|
||||||
|
# SQLite3
|
||||||
|
LOCAL_SRC_FILES += deps/Android/sqlite/sqlite3.c
|
||||||
|
|
||||||
|
LOCAL_STATIC_LIBRARIES += Curl Freetype Irrlicht OpenAL mbedTLS mbedx509 mbedcrypto Vorbis LuaJIT android_native_app_glue $(PROFILER_LIBS) #LevelDB
|
||||||
|
#OpenSSL Crypto
|
||||||
|
|
||||||
|
LOCAL_LDLIBS := -lEGL -lGLESv1_CM -lGLESv2 -landroid -lOpenSLES
|
||||||
|
|
||||||
|
include $(BUILD_SHARED_LIBRARY)
|
||||||
|
|
||||||
|
ifdef GPROF
|
||||||
|
$(call import-module,android-ndk-profiler)
|
||||||
|
endif
|
||||||
|
$(call import-module,android/native_app_glue)
|
32
build/android/native/jni/Application.mk
Normal file
32
build/android/native/jni/Application.mk
Normal file
@ -0,0 +1,32 @@
|
|||||||
|
APP_PLATFORM := ${APP_PLATFORM}
|
||||||
|
APP_ABI := ${TARGET_ABI}
|
||||||
|
APP_STL := c++_shared
|
||||||
|
NDK_TOOLCHAIN_VERSION := clang
|
||||||
|
APP_SHORT_COMMANDS := true
|
||||||
|
APP_MODULES := Minetest
|
||||||
|
|
||||||
|
APP_CPPFLAGS := -Ofast -fvisibility=hidden -fexceptions -Wno-deprecated-declarations -Wno-extra-tokens
|
||||||
|
|
||||||
|
ifeq ($(APP_ABI),armeabi-v7a)
|
||||||
|
APP_CPPFLAGS += -march=armv7-a -mfloat-abi=softfp -mfpu=vfpv3-d16 -mthumb
|
||||||
|
endif
|
||||||
|
|
||||||
|
#ifeq ($(APP_ABI),x86)
|
||||||
|
#APP_CPPFLAGS += -march=i686 -mtune=intel -mssse3 -mfpmath=sse -m32 -funroll-loops
|
||||||
|
#endif
|
||||||
|
|
||||||
|
ifndef NDEBUG
|
||||||
|
APP_CPPFLAGS := -g -D_DEBUG -O0 -fno-omit-frame-pointer -fexceptions
|
||||||
|
endif
|
||||||
|
|
||||||
|
APP_CFLAGS := $(APP_CPPFLAGS) -Wno-parentheses-equality #-Werror=shorten-64-to-32
|
||||||
|
APP_CXXFLAGS := $(APP_CPPFLAGS) -frtti -std=gnu++17
|
||||||
|
APP_LDFLAGS := -Wl,--no-warn-mismatch,--gc-sections,--icf=safe
|
||||||
|
|
||||||
|
ifeq ($(APP_ABI),arm64-v8a)
|
||||||
|
APP_LDFLAGS := -Wl,--no-warn-mismatch,--gc-sections
|
||||||
|
endif
|
||||||
|
|
||||||
|
ifndef NDEBUG
|
||||||
|
APP_LDFLAGS :=
|
||||||
|
endif
|
1
build/android/native/src/main/AndroidManifest.xml
Normal file
1
build/android/native/src/main/AndroidManifest.xml
Normal file
@ -0,0 +1 @@
|
|||||||
|
<manifest package="net.minetest" />
|
@ -1,20 +0,0 @@
|
|||||||
--- irrlicht/source/Irrlicht/Android/CIrrDeviceAndroid.cpp.orig 2015-08-29 15:43:09.000000000 +0300
|
|
||||||
+++ irrlicht/source/Irrlicht/Android/CIrrDeviceAndroid.cpp 2016-05-13 21:36:22.880388505 +0300
|
|
||||||
@@ -486,7 +486,7 @@
|
|
||||||
event.KeyInput.Char = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
- device->postEventFromUser(event);
|
|
||||||
+ status = device->postEventFromUser(event);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
@@ -543,7 +543,7 @@
|
|
||||||
KeyMap[1] = KEY_LBUTTON; // AKEYCODE_SOFT_LEFT
|
|
||||||
KeyMap[2] = KEY_RBUTTON; // AKEYCODE_SOFT_RIGHT
|
|
||||||
KeyMap[3] = KEY_HOME; // AKEYCODE_HOME
|
|
||||||
- KeyMap[4] = KEY_BACK; // AKEYCODE_BACK
|
|
||||||
+ KeyMap[4] = KEY_CANCEL; // AKEYCODE_BACK
|
|
||||||
KeyMap[5] = KEY_UNKNOWN; // AKEYCODE_CALL
|
|
||||||
KeyMap[6] = KEY_UNKNOWN; // AKEYCODE_ENDCALL
|
|
||||||
KeyMap[7] = KEY_KEY_0; // AKEYCODE_0
|
|
@ -1,13 +0,0 @@
|
|||||||
--- irrlicht/source/Irrlicht/CEGLManager.cpp.orig 2018-09-11 18:19:51.453403631 +0300
|
|
||||||
+++ irrlicht/source/Irrlicht/CEGLManager.cpp 2018-09-11 18:36:24.603471869 +0300
|
|
||||||
@@ -9,6 +9,10 @@
|
|
||||||
#include "irrString.h"
|
|
||||||
#include "os.h"
|
|
||||||
|
|
||||||
+#if defined(_IRR_COMPILE_WITH_ANDROID_DEVICE_)
|
|
||||||
+#include <android/native_activity.h>
|
|
||||||
+#endif
|
|
||||||
+
|
|
||||||
namespace irr
|
|
||||||
{
|
|
||||||
namespace video
|
|
@ -1,240 +0,0 @@
|
|||||||
--- irrlicht/source/Irrlicht/COGLESTexture.cpp.orig 2014-06-22 17:01:13.266568869 +0200
|
|
||||||
+++ irrlicht/source/Irrlicht/COGLESTexture.cpp 2014-06-22 17:03:59.298572810 +0200
|
|
||||||
@@ -366,112 +366,140 @@
|
|
||||||
void(*convert)(const void*, s32, void*) = 0;
|
|
||||||
getFormatParameters(ColorFormat, InternalFormat, filtering, PixelFormat, PixelType, convert);
|
|
||||||
|
|
||||||
- // make sure we don't change the internal format of existing images
|
|
||||||
- if (!newTexture)
|
|
||||||
- InternalFormat = oldInternalFormat;
|
|
||||||
-
|
|
||||||
- Driver->setActiveTexture(0, this);
|
|
||||||
-
|
|
||||||
- if (Driver->testGLError())
|
|
||||||
- os::Printer::log("Could not bind Texture", ELL_ERROR);
|
|
||||||
-
|
|
||||||
- // mipmap handling for main texture
|
|
||||||
- if (!level && newTexture)
|
|
||||||
- {
|
|
||||||
- // auto generate if possible and no mipmap data is given
|
|
||||||
- if (!IsCompressed && HasMipMaps && !mipmapData && Driver->queryFeature(EVDF_MIP_MAP_AUTO_UPDATE))
|
|
||||||
- {
|
|
||||||
- if (Driver->getTextureCreationFlag(ETCF_OPTIMIZED_FOR_SPEED))
|
|
||||||
- glHint(GL_GENERATE_MIPMAP_HINT, GL_FASTEST);
|
|
||||||
- else if (Driver->getTextureCreationFlag(ETCF_OPTIMIZED_FOR_QUALITY))
|
|
||||||
- glHint(GL_GENERATE_MIPMAP_HINT, GL_NICEST);
|
|
||||||
- else
|
|
||||||
- glHint(GL_GENERATE_MIPMAP_HINT, GL_DONT_CARE);
|
|
||||||
+ bool retry = false;
|
|
||||||
+
|
|
||||||
+ do {
|
|
||||||
+ if (retry) {
|
|
||||||
+ InternalFormat = GL_RGBA;
|
|
||||||
+ PixelFormat = GL_RGBA;
|
|
||||||
+ convert = CColorConverter::convert_A8R8G8B8toA8B8G8R8;
|
|
||||||
+ }
|
|
||||||
+ // make sure we don't change the internal format of existing images
|
|
||||||
+ if (!newTexture)
|
|
||||||
+ InternalFormat = oldInternalFormat;
|
|
||||||
|
|
||||||
- glTexParameteri(GL_TEXTURE_2D, GL_GENERATE_MIPMAP, GL_TRUE);
|
|
||||||
- AutomaticMipmapUpdate=true;
|
|
||||||
- }
|
|
||||||
+ Driver->setActiveTexture(0, this);
|
|
||||||
|
|
||||||
- // enable bilinear filter without mipmaps
|
|
||||||
- glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, filtering);
|
|
||||||
- glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, filtering);
|
|
||||||
- }
|
|
||||||
+ if (Driver->testGLError())
|
|
||||||
+ os::Printer::log("Could not bind Texture", ELL_ERROR);
|
|
||||||
|
|
||||||
- // now get image data and upload to GPU
|
|
||||||
+ // mipmap handling for main texture
|
|
||||||
+ if (!level && newTexture)
|
|
||||||
+ {
|
|
||||||
+ // auto generate if possible and no mipmap data is given
|
|
||||||
+ if (!IsCompressed && HasMipMaps && !mipmapData && Driver->queryFeature(EVDF_MIP_MAP_AUTO_UPDATE))
|
|
||||||
+ {
|
|
||||||
+ if (Driver->getTextureCreationFlag(ETCF_OPTIMIZED_FOR_SPEED))
|
|
||||||
+ glHint(GL_GENERATE_MIPMAP_HINT, GL_FASTEST);
|
|
||||||
+ else if (Driver->getTextureCreationFlag(ETCF_OPTIMIZED_FOR_QUALITY))
|
|
||||||
+ glHint(GL_GENERATE_MIPMAP_HINT, GL_NICEST);
|
|
||||||
+ else
|
|
||||||
+ glHint(GL_GENERATE_MIPMAP_HINT, GL_DONT_CARE);
|
|
||||||
+
|
|
||||||
+ glTexParameteri(GL_TEXTURE_2D, GL_GENERATE_MIPMAP, GL_TRUE);
|
|
||||||
+ AutomaticMipmapUpdate=true;
|
|
||||||
+ }
|
|
||||||
+
|
|
||||||
+ // enable bilinear filter without mipmaps
|
|
||||||
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, filtering);
|
|
||||||
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, filtering);
|
|
||||||
+ }
|
|
||||||
|
|
||||||
- u32 compressedImageSize = IImage::getCompressedImageSize(ColorFormat, image->getDimension().Width, image->getDimension().Height);
|
|
||||||
+ // now get image data and upload to GPU
|
|
||||||
|
|
||||||
- void* source = image->lock();
|
|
||||||
+ u32 compressedImageSize = IImage::getCompressedImageSize(ColorFormat, image->getDimension().Width, image->getDimension().Height);
|
|
||||||
|
|
||||||
- IImage* tmpImage = 0;
|
|
||||||
+ void* source = image->lock();
|
|
||||||
|
|
||||||
- if (convert)
|
|
||||||
- {
|
|
||||||
- tmpImage = new CImage(image->getColorFormat(), image->getDimension());
|
|
||||||
- void* dest = tmpImage->lock();
|
|
||||||
- convert(source, image->getDimension().getArea(), dest);
|
|
||||||
- image->unlock();
|
|
||||||
- source = dest;
|
|
||||||
- }
|
|
||||||
+ IImage* tmpImage = 0;
|
|
||||||
|
|
||||||
- if (newTexture)
|
|
||||||
- {
|
|
||||||
- if (IsCompressed)
|
|
||||||
+ if (convert)
|
|
||||||
{
|
|
||||||
- glCompressedTexImage2D(GL_TEXTURE_2D, 0, InternalFormat, image->getDimension().Width,
|
|
||||||
- image->getDimension().Height, 0, compressedImageSize, source);
|
|
||||||
+ tmpImage = new CImage(image->getColorFormat(), image->getDimension());
|
|
||||||
+ void* dest = tmpImage->lock();
|
|
||||||
+ convert(source, image->getDimension().getArea(), dest);
|
|
||||||
+ image->unlock();
|
|
||||||
+ source = dest;
|
|
||||||
}
|
|
||||||
- else
|
|
||||||
- glTexImage2D(GL_TEXTURE_2D, level, InternalFormat, image->getDimension().Width,
|
|
||||||
- image->getDimension().Height, 0, PixelFormat, PixelType, source);
|
|
||||||
- }
|
|
||||||
- else
|
|
||||||
- {
|
|
||||||
- if (IsCompressed)
|
|
||||||
+
|
|
||||||
+ if (newTexture)
|
|
||||||
{
|
|
||||||
- glCompressedTexSubImage2D(GL_TEXTURE_2D, level, 0, 0, image->getDimension().Width,
|
|
||||||
- image->getDimension().Height, PixelFormat, compressedImageSize, source);
|
|
||||||
+ if (IsCompressed)
|
|
||||||
+ {
|
|
||||||
+ glCompressedTexImage2D(GL_TEXTURE_2D, 0, InternalFormat, image->getDimension().Width,
|
|
||||||
+ image->getDimension().Height, 0, compressedImageSize, source);
|
|
||||||
+ }
|
|
||||||
+ else
|
|
||||||
+ glTexImage2D(GL_TEXTURE_2D, level, InternalFormat, image->getDimension().Width,
|
|
||||||
+ image->getDimension().Height, 0, PixelFormat, PixelType, source);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
- glTexSubImage2D(GL_TEXTURE_2D, level, 0, 0, image->getDimension().Width,
|
|
||||||
- image->getDimension().Height, PixelFormat, PixelType, source);
|
|
||||||
- }
|
|
||||||
-
|
|
||||||
- if (convert)
|
|
||||||
- {
|
|
||||||
- tmpImage->unlock();
|
|
||||||
- tmpImage->drop();
|
|
||||||
- }
|
|
||||||
- else
|
|
||||||
- image->unlock();
|
|
||||||
-
|
|
||||||
- if (!level && newTexture)
|
|
||||||
- {
|
|
||||||
- if (IsCompressed && !mipmapData)
|
|
||||||
{
|
|
||||||
- if (image->hasMipMaps())
|
|
||||||
- mipmapData = static_cast<u8*>(image->lock())+compressedImageSize;
|
|
||||||
+ if (IsCompressed)
|
|
||||||
+ {
|
|
||||||
+ glCompressedTexSubImage2D(GL_TEXTURE_2D, level, 0, 0, image->getDimension().Width,
|
|
||||||
+ image->getDimension().Height, PixelFormat, compressedImageSize, source);
|
|
||||||
+ }
|
|
||||||
else
|
|
||||||
- HasMipMaps = false;
|
|
||||||
+ glTexSubImage2D(GL_TEXTURE_2D, level, 0, 0, image->getDimension().Width,
|
|
||||||
+ image->getDimension().Height, PixelFormat, PixelType, source);
|
|
||||||
}
|
|
||||||
|
|
||||||
- regenerateMipMapLevels(mipmapData);
|
|
||||||
-
|
|
||||||
- if (HasMipMaps) // might have changed in regenerateMipMapLevels
|
|
||||||
+ if (convert)
|
|
||||||
{
|
|
||||||
- // enable bilinear mipmap filter
|
|
||||||
- GLint filteringMipMaps = GL_LINEAR_MIPMAP_NEAREST;
|
|
||||||
-
|
|
||||||
- if (filtering != GL_LINEAR)
|
|
||||||
- filteringMipMaps = GL_NEAREST_MIPMAP_NEAREST;
|
|
||||||
+ tmpImage->unlock();
|
|
||||||
+ tmpImage->drop();
|
|
||||||
+ }
|
|
||||||
+ else
|
|
||||||
+ image->unlock();
|
|
||||||
+
|
|
||||||
+ if (glGetError() != GL_NO_ERROR) {
|
|
||||||
+ static bool warned = false;
|
|
||||||
+ if ((!retry) && (ColorFormat == ECF_A8R8G8B8)) {
|
|
||||||
+
|
|
||||||
+ if (!warned) {
|
|
||||||
+ os::Printer::log("Your driver claims to support GL_BGRA but fails on trying to upload a texture, converting to GL_RGBA and trying again", ELL_ERROR);
|
|
||||||
+ warned = true;
|
|
||||||
+ }
|
|
||||||
+ }
|
|
||||||
+ else if (retry) {
|
|
||||||
+ os::Printer::log("Neither uploading texture as GL_BGRA nor, converted one using GL_RGBA succeeded", ELL_ERROR);
|
|
||||||
+ }
|
|
||||||
+ retry = !retry;
|
|
||||||
+ continue;
|
|
||||||
+ } else {
|
|
||||||
+ retry = false;
|
|
||||||
+ }
|
|
||||||
|
|
||||||
- glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, filteringMipMaps);
|
|
||||||
- glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, filtering);
|
|
||||||
+ if (!level && newTexture)
|
|
||||||
+ {
|
|
||||||
+ if (IsCompressed && !mipmapData)
|
|
||||||
+ {
|
|
||||||
+ if (image->hasMipMaps())
|
|
||||||
+ mipmapData = static_cast<u8*>(image->lock())+compressedImageSize;
|
|
||||||
+ else
|
|
||||||
+ HasMipMaps = false;
|
|
||||||
+ }
|
|
||||||
+
|
|
||||||
+ regenerateMipMapLevels(mipmapData);
|
|
||||||
+
|
|
||||||
+ if (HasMipMaps) // might have changed in regenerateMipMapLevels
|
|
||||||
+ {
|
|
||||||
+ // enable bilinear mipmap filter
|
|
||||||
+ GLint filteringMipMaps = GL_LINEAR_MIPMAP_NEAREST;
|
|
||||||
+
|
|
||||||
+ if (filtering != GL_LINEAR)
|
|
||||||
+ filteringMipMaps = GL_NEAREST_MIPMAP_NEAREST;
|
|
||||||
+
|
|
||||||
+ glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, filteringMipMaps);
|
|
||||||
+ glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, filtering);
|
|
||||||
+ }
|
|
||||||
}
|
|
||||||
- }
|
|
||||||
|
|
||||||
- if (Driver->testGLError())
|
|
||||||
- os::Printer::log("Could not glTexImage2D", ELL_ERROR);
|
|
||||||
+ if (Driver->testGLError())
|
|
||||||
+ os::Printer::log("Could not glTexImage2D", ELL_ERROR);
|
|
||||||
+ }
|
|
||||||
+ while(retry);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
--- irrlicht/source/Irrlicht/COGLESTexture.cpp.orig 2014-06-25 00:28:50.820501856 +0200
|
|
||||||
+++ irrlicht/source/Irrlicht/COGLESTexture.cpp 2014-06-25 00:08:37.712544692 +0200
|
|
||||||
@@ -422,6 +422,9 @@
|
|
||||||
source = dest;
|
|
||||||
}
|
|
||||||
|
|
||||||
+ //clear old error
|
|
||||||
+ glGetError();
|
|
||||||
+
|
|
||||||
if (newTexture)
|
|
||||||
{
|
|
||||||
if (IsCompressed)
|
|
@ -1,30 +0,0 @@
|
|||||||
--- irrlicht.orig/include/IEventReceiver.h 2014-06-03 19:43:50.433713133 +0200
|
|
||||||
+++ irrlicht/include/IEventReceiver.h 2014-06-03 19:44:36.993711489 +0200
|
|
||||||
@@ -375,6 +375,9 @@
|
|
||||||
// Y position of simple touch.
|
|
||||||
s32 Y;
|
|
||||||
|
|
||||||
+ // number of current touches
|
|
||||||
+ s32 touchedCount;
|
|
||||||
+
|
|
||||||
//! Type of touch event.
|
|
||||||
ETOUCH_INPUT_EVENT Event;
|
|
||||||
};
|
|
||||||
--- irrlicht.orig/source/Irrlicht/Android/CIrrDeviceAndroid.cpp 2014-06-03 19:43:50.505713130 +0200
|
|
||||||
+++ irrlicht/source/Irrlicht/Android/CIrrDeviceAndroid.cpp 2014-06-03 19:45:37.265709359 +0200
|
|
||||||
@@ -315,6 +315,7 @@
|
|
||||||
event.TouchInput.ID = AMotionEvent_getPointerId(androidEvent, i);
|
|
||||||
event.TouchInput.X = AMotionEvent_getX(androidEvent, i);
|
|
||||||
event.TouchInput.Y = AMotionEvent_getY(androidEvent, i);
|
|
||||||
+ event.TouchInput.touchedCount = AMotionEvent_getPointerCount(androidEvent);
|
|
||||||
|
|
||||||
device->postEventFromUser(event);
|
|
||||||
}
|
|
||||||
@@ -326,6 +327,7 @@
|
|
||||||
event.TouchInput.ID = AMotionEvent_getPointerId(androidEvent, pointerIndex);
|
|
||||||
event.TouchInput.X = AMotionEvent_getX(androidEvent, pointerIndex);
|
|
||||||
event.TouchInput.Y = AMotionEvent_getY(androidEvent, pointerIndex);
|
|
||||||
+ event.TouchInput.touchedCount = AMotionEvent_getPointerCount(androidEvent);
|
|
||||||
|
|
||||||
device->postEventFromUser(event);
|
|
||||||
}
|
|
@ -1,37 +0,0 @@
|
|||||||
--- libvorbis-libogg-android/jni/libvorbis-jni/Android.mk.orig 2014-06-17 19:22:50.621559073 +0200
|
|
||||||
+++ libvorbis-libogg-android/jni/libvorbis-jni/Android.mk 2014-06-17 19:38:20.641581140 +0200
|
|
||||||
@@ -4,9 +4,6 @@
|
|
||||||
|
|
||||||
LOCAL_MODULE := vorbis-jni
|
|
||||||
LOCAL_CFLAGS += -I$(LOCAL_PATH)/../include -fsigned-char
|
|
||||||
-ifeq ($(TARGET_ARCH),arm)
|
|
||||||
- LOCAL_CFLAGS += -march=armv6 -marm -mfloat-abi=softfp -mfpu=vfp
|
|
||||||
-endif
|
|
||||||
|
|
||||||
LOCAL_SHARED_LIBRARIES := libogg libvorbis
|
|
||||||
|
|
||||||
--- libvorbis-libogg-android/jni/libvorbis/Android.mk.orig 2014-06-17 19:22:39.077558797 +0200
|
|
||||||
+++ libvorbis-libogg-android/jni/libvorbis/Android.mk 2014-06-17 19:38:52.121581887 +0200
|
|
||||||
@@ -4,9 +4,6 @@
|
|
||||||
|
|
||||||
LOCAL_MODULE := libvorbis
|
|
||||||
LOCAL_CFLAGS += -I$(LOCAL_PATH)/../include -ffast-math -fsigned-char
|
|
||||||
-ifeq ($(TARGET_ARCH),arm)
|
|
||||||
- LOCAL_CFLAGS += -march=armv6 -marm -mfloat-abi=softfp -mfpu=vfp
|
|
||||||
-endif
|
|
||||||
LOCAL_SHARED_LIBRARIES := libogg
|
|
||||||
|
|
||||||
LOCAL_SRC_FILES := \
|
|
||||||
--- libvorbis-libogg-android/jni/libogg/Android.mk.orig 2014-06-17 19:22:33.965558675 +0200
|
|
||||||
+++ libvorbis-libogg-android/jni/libogg/Android.mk 2014-06-17 19:38:25.337581252 +0200
|
|
||||||
@@ -4,10 +4,6 @@
|
|
||||||
|
|
||||||
LOCAL_MODULE := libogg
|
|
||||||
LOCAL_CFLAGS += -I$(LOCAL_PATH)/../include -ffast-math -fsigned-char
|
|
||||||
-ifeq ($(TARGET_ARCH),arm)
|
|
||||||
- LOCAL_CFLAGS += -march=armv6 -marm -mfloat-abi=softfp -mfpu=vfp
|
|
||||||
-endif
|
|
||||||
-
|
|
||||||
|
|
||||||
LOCAL_SRC_FILES := \
|
|
||||||
bitwise.c \
|
|
@ -1,13 +0,0 @@
|
|||||||
--- openssl-1.0.2e.orig/Configure 2015-12-03 15:04:23.000000000 +0100
|
|
||||||
+++ openssl-1.0.2e/Configure 2015-12-14 21:01:40.351265968 +0100
|
|
||||||
@@ -464,8 +464,10 @@
|
|
||||||
# Android: linux-* but without pointers to headers and libs.
|
|
||||||
"android","gcc:-mandroid -I\$(ANDROID_DEV)/include -B\$(ANDROID_DEV)/lib -O3 -fomit-frame-pointer -Wall::-D_REENTRANT::-ldl:BN_LLONG RC4_CHAR RC4_CHUNK DES_INT DES_UNROLL BF_PTR:${no_asm}:dlfcn:linux-shared:-fPIC::.so.\$(SHLIB_MAJOR).\$(SHLIB_MINOR)",
|
|
||||||
"android-x86","gcc:-mandroid -I\$(ANDROID_DEV)/include -B\$(ANDROID_DEV)/lib -O3 -fomit-frame-pointer -Wall::-D_REENTRANT::-ldl:BN_LLONG ${x86_gcc_des} ${x86_gcc_opts}:".eval{my $asm=${x86_elf_asm};$asm=~s/:elf/:android/;$asm}.":dlfcn:linux-shared:-fPIC::.so.\$(SHLIB_MAJOR).\$(SHLIB_MINOR)",
|
|
||||||
+"android-arm","gcc:-march=armv4 -mandroid -I\$(ANDROID_DEV)/include -B\$(ANDROID_DEV)/lib -O3 -fomit-frame-pointer -Wall::-D_REENTRANT::-ldl:BN_LLONG RC4_CHAR RC4_CHUNK DES_INT DES_UNROLL BF_PTR:${armv4_asm}:dlfcn:linux-shared:-fPIC::.so.\$(SHLIB_MAJOR).\$(SHLIB_MINOR)",
|
|
||||||
"android-armv7","gcc:-march=armv7-a -mandroid -I\$(ANDROID_DEV)/include -B\$(ANDROID_DEV)/lib -O3 -fomit-frame-pointer -Wall::-D_REENTRANT::-ldl:BN_LLONG RC4_CHAR RC4_CHUNK DES_INT DES_UNROLL BF_PTR:${armv4_asm}:dlfcn:linux-shared:-fPIC::.so.\$(SHLIB_MAJOR).\$(SHLIB_MINOR)",
|
|
||||||
"android-mips","gcc:-mandroid -I\$(ANDROID_DEV)/include -B\$(ANDROID_DEV)/lib -O3 -Wall::-D_REENTRANT::-ldl:BN_LLONG RC4_CHAR RC4_CHUNK DES_INT DES_UNROLL BF_PTR:${mips32_asm}:o32:dlfcn:linux-shared:-fPIC::.so.\$(SHLIB_MAJOR).\$(SHLIB_MINOR)",
|
|
||||||
+"android-mips32","gcc:-mandroid -I\$(ANDROID_DEV)/include -B\$(ANDROID_DEV)/lib -O3 -Wall::-D_REENTRANT::-ldl:BN_LLONG RC4_CHAR RC4_CHUNK DES_INT DES_UNROLL BF_PTR:${mips32_asm}:o32:dlfcn:linux-shared:-fPIC::.so.\$(SHLIB_MAJOR).\$(SHLIB_MINOR)",
|
|
||||||
|
|
||||||
#### *BSD [do see comment about ${BSDthreads} above!]
|
|
||||||
"BSD-generic32","gcc:-O3 -fomit-frame-pointer -Wall::${BSDthreads}:::BN_LLONG RC2_CHAR RC4_INDEX DES_INT DES_UNROLL:${no_asm}:dlfcn:bsd-gcc-shared:-fPIC::.so.\$(SHLIB_MAJOR).\$(SHLIB_MINOR)",
|
|
@ -1 +1,2 @@
|
|||||||
rootProject.name = "Minetest"
|
rootProject.name = "Minetest"
|
||||||
|
include ':app', ':native'
|
||||||
|
@ -1,77 +0,0 @@
|
|||||||
package net.minetest.minetest;
|
|
||||||
|
|
||||||
import android.Manifest;
|
|
||||||
import android.app.Activity;
|
|
||||||
import android.content.Intent;
|
|
||||||
import android.content.pm.PackageManager;
|
|
||||||
import android.os.Build;
|
|
||||||
import android.os.Bundle;
|
|
||||||
import android.widget.Toast;
|
|
||||||
|
|
||||||
import androidx.annotation.NonNull;
|
|
||||||
import androidx.core.app.ActivityCompat;
|
|
||||||
import androidx.core.content.ContextCompat;
|
|
||||||
|
|
||||||
import java.util.ArrayList;
|
|
||||||
import java.util.Arrays;
|
|
||||||
import java.util.List;
|
|
||||||
|
|
||||||
public class MainActivity extends Activity {
|
|
||||||
private final static int PERMISSIONS = 1;
|
|
||||||
private static final String[] REQUIRED_SDK_PERMISSIONS = new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE};
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void onCreate(Bundle savedInstanceState) {
|
|
||||||
super.onCreate(savedInstanceState);
|
|
||||||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
|
|
||||||
checkPermission();
|
|
||||||
} else {
|
|
||||||
next();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private void checkPermission() {
|
|
||||||
final List<String> missingPermissions = new ArrayList<>();
|
|
||||||
// check required permission
|
|
||||||
for (final String permission : REQUIRED_SDK_PERMISSIONS) {
|
|
||||||
final int result = ContextCompat.checkSelfPermission(this, permission);
|
|
||||||
if (result != PackageManager.PERMISSION_GRANTED) {
|
|
||||||
missingPermissions.add(permission);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (!missingPermissions.isEmpty()) {
|
|
||||||
// request permission
|
|
||||||
final String[] permissions = missingPermissions
|
|
||||||
.toArray(new String[0]);
|
|
||||||
ActivityCompat.requestPermissions(this, permissions, PERMISSIONS);
|
|
||||||
} else {
|
|
||||||
final int[] grantResults = new int[REQUIRED_SDK_PERMISSIONS.length];
|
|
||||||
Arrays.fill(grantResults, PackageManager.PERMISSION_GRANTED);
|
|
||||||
onRequestPermissionsResult(PERMISSIONS, REQUIRED_SDK_PERMISSIONS,
|
|
||||||
grantResults);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions,
|
|
||||||
@NonNull int[] grantResults) {
|
|
||||||
if (requestCode == PERMISSIONS) {
|
|
||||||
for (int index = 0; index < permissions.length; index++) {
|
|
||||||
if (grantResults[index] != PackageManager.PERMISSION_GRANTED) {
|
|
||||||
// permission not granted - toast and exit
|
|
||||||
Toast.makeText(this, R.string.not_granted, Toast.LENGTH_LONG).show();
|
|
||||||
finish();
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
// permission were granted - run
|
|
||||||
next();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private void next() {
|
|
||||||
Intent intent = new Intent(this, MtNativeActivity.class);
|
|
||||||
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_CLEAR_TASK);
|
|
||||||
startActivity(intent);
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,371 +0,0 @@
|
|||||||
package net.minetest.minetest;
|
|
||||||
|
|
||||||
import android.annotation.SuppressLint;
|
|
||||||
import android.app.Activity;
|
|
||||||
import android.content.res.AssetFileDescriptor;
|
|
||||||
import android.os.AsyncTask;
|
|
||||||
import android.os.Build;
|
|
||||||
import android.os.Bundle;
|
|
||||||
import android.os.Environment;
|
|
||||||
import android.util.Log;
|
|
||||||
import android.view.Display;
|
|
||||||
import android.view.View;
|
|
||||||
import android.widget.ProgressBar;
|
|
||||||
import android.widget.TextView;
|
|
||||||
|
|
||||||
import java.io.BufferedReader;
|
|
||||||
import java.io.File;
|
|
||||||
import java.io.FileOutputStream;
|
|
||||||
import java.io.IOException;
|
|
||||||
import java.io.InputStream;
|
|
||||||
import java.io.InputStreamReader;
|
|
||||||
import java.io.OutputStream;
|
|
||||||
import java.util.Vector;
|
|
||||||
|
|
||||||
public class MinetestAssetCopy extends Activity {
|
|
||||||
private ProgressBar m_ProgressBar;
|
|
||||||
private TextView m_Filename;
|
|
||||||
private copyAssetTask m_AssetCopy;
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void onCreate(Bundle savedInstanceState) {
|
|
||||||
super.onCreate(savedInstanceState);
|
|
||||||
setContentView(R.layout.assetcopy);
|
|
||||||
m_ProgressBar = findViewById(R.id.progressBar1);
|
|
||||||
m_Filename = findViewById(R.id.textView1);
|
|
||||||
Display display = getWindowManager().getDefaultDisplay();
|
|
||||||
m_ProgressBar.getLayoutParams().width = (int) (display.getWidth() * 0.8);
|
|
||||||
m_ProgressBar.invalidate();
|
|
||||||
|
|
||||||
/* check if there's already a copy in progress and reuse in case it is*/
|
|
||||||
MinetestAssetCopy prevActivity =
|
|
||||||
(MinetestAssetCopy) getLastNonConfigurationInstance();
|
|
||||||
if (prevActivity != null) {
|
|
||||||
m_AssetCopy = prevActivity.m_AssetCopy;
|
|
||||||
} else {
|
|
||||||
m_AssetCopy = new copyAssetTask();
|
|
||||||
m_AssetCopy.execute();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected void onResume() {
|
|
||||||
super.onResume();
|
|
||||||
makeFullScreen();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected void onDestroy() {
|
|
||||||
super.onDestroy();
|
|
||||||
if (m_AssetCopy != null) {
|
|
||||||
m_AssetCopy.cancel(true);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private void makeFullScreen() {
|
|
||||||
if (Build.VERSION.SDK_INT >= 19)
|
|
||||||
this.getWindow().getDecorView().setSystemUiVisibility(
|
|
||||||
View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void onWindowFocusChanged(boolean hasFocus) {
|
|
||||||
super.onWindowFocusChanged(hasFocus);
|
|
||||||
if (hasFocus)
|
|
||||||
makeFullScreen();
|
|
||||||
}
|
|
||||||
|
|
||||||
/* preserve asset copy background task to prevent restart of copying */
|
|
||||||
/* this way of doing it is not recommended for latest android version */
|
|
||||||
/* but the recommended way isn't available on android 2.x */
|
|
||||||
public Object onRetainNonConfigurationInstance() {
|
|
||||||
return this;
|
|
||||||
}
|
|
||||||
|
|
||||||
@SuppressLint("StaticFieldLeak")
|
|
||||||
private class copyAssetTask extends AsyncTask<String, Integer, String> {
|
|
||||||
boolean m_copy_started = false;
|
|
||||||
String m_Foldername = "media";
|
|
||||||
Vector<String> m_foldernames;
|
|
||||||
Vector<String> m_filenames;
|
|
||||||
Vector<String> m_tocopy;
|
|
||||||
Vector<String> m_asset_size_unknown;
|
|
||||||
|
|
||||||
private long getFullSize(String filename) {
|
|
||||||
long size = 0;
|
|
||||||
try {
|
|
||||||
InputStream src = getAssets().open(filename);
|
|
||||||
byte[] buf = new byte[4096];
|
|
||||||
|
|
||||||
int len;
|
|
||||||
while ((len = src.read(buf)) > 0) {
|
|
||||||
size += len;
|
|
||||||
}
|
|
||||||
} catch (IOException e) {
|
|
||||||
e.printStackTrace();
|
|
||||||
}
|
|
||||||
return size;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected String doInBackground(String... files) {
|
|
||||||
m_foldernames = new Vector<>();
|
|
||||||
m_filenames = new Vector<>();
|
|
||||||
m_tocopy = new Vector<>();
|
|
||||||
m_asset_size_unknown = new Vector<>();
|
|
||||||
String baseDir =
|
|
||||||
Environment.getExternalStorageDirectory().getAbsolutePath()
|
|
||||||
+ "/";
|
|
||||||
|
|
||||||
|
|
||||||
// prepare temp folder
|
|
||||||
File TempFolder = new File(baseDir + "Minetest/tmp/");
|
|
||||||
|
|
||||||
if (!TempFolder.exists()) {
|
|
||||||
TempFolder.mkdir();
|
|
||||||
} else {
|
|
||||||
File[] todel = TempFolder.listFiles();
|
|
||||||
|
|
||||||
for (File file : todel) {
|
|
||||||
Log.v("MinetestAssetCopy", "deleting: " + file.getAbsolutePath());
|
|
||||||
file.delete();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// add a .nomedia file
|
|
||||||
try {
|
|
||||||
OutputStream dst = new FileOutputStream(baseDir + "Minetest/.nomedia");
|
|
||||||
dst.close();
|
|
||||||
} catch (IOException e) {
|
|
||||||
Log.e("MinetestAssetCopy", "Failed to create .nomedia file");
|
|
||||||
e.printStackTrace();
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// build lists from prepared data
|
|
||||||
BuildFolderList();
|
|
||||||
BuildFileList();
|
|
||||||
|
|
||||||
// scan filelist
|
|
||||||
ProcessFileList();
|
|
||||||
|
|
||||||
// doing work
|
|
||||||
m_copy_started = true;
|
|
||||||
m_ProgressBar.setMax(m_tocopy.size());
|
|
||||||
|
|
||||||
for (int i = 0; i < m_tocopy.size(); i++) {
|
|
||||||
try {
|
|
||||||
String filename = m_tocopy.get(i);
|
|
||||||
publishProgress(i);
|
|
||||||
|
|
||||||
boolean asset_size_unknown = false;
|
|
||||||
long filesize = -1;
|
|
||||||
|
|
||||||
if (m_asset_size_unknown.contains(filename)) {
|
|
||||||
File testme = new File(baseDir + "/" + filename);
|
|
||||||
|
|
||||||
if (testme.exists())
|
|
||||||
filesize = testme.length();
|
|
||||||
|
|
||||||
asset_size_unknown = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
InputStream src;
|
|
||||||
try {
|
|
||||||
src = getAssets().open(filename);
|
|
||||||
} catch (IOException e) {
|
|
||||||
Log.e("MinetestAssetCopy", "Copying file: " + filename + " FAILED (not in assets)");
|
|
||||||
e.printStackTrace();
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Transfer bytes from in to out
|
|
||||||
byte[] buf = new byte[1024];
|
|
||||||
int len = src.read(buf, 0, 1024);
|
|
||||||
|
|
||||||
/* following handling is crazy but we need to deal with */
|
|
||||||
/* compressed assets.Flash chips limited livetime due to */
|
|
||||||
/* write operations, we can't allow large files to destroy */
|
|
||||||
/* users flash. */
|
|
||||||
if (asset_size_unknown) {
|
|
||||||
if ((len > 0) && (len < buf.length) && (len == filesize)) {
|
|
||||||
src.close();
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (len == buf.length) {
|
|
||||||
src.close();
|
|
||||||
long size = getFullSize(filename);
|
|
||||||
if (size == filesize) {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
src = getAssets().open(filename);
|
|
||||||
len = src.read(buf, 0, 1024);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (len > 0) {
|
|
||||||
int total_filesize = 0;
|
|
||||||
OutputStream dst;
|
|
||||||
try {
|
|
||||||
dst = new FileOutputStream(baseDir + "/" + filename);
|
|
||||||
} catch (IOException e) {
|
|
||||||
Log.e("MinetestAssetCopy", "Copying file: " + baseDir +
|
|
||||||
"/" + filename + " FAILED (couldn't open output file)");
|
|
||||||
e.printStackTrace();
|
|
||||||
src.close();
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
dst.write(buf, 0, len);
|
|
||||||
total_filesize += len;
|
|
||||||
|
|
||||||
while ((len = src.read(buf)) > 0) {
|
|
||||||
dst.write(buf, 0, len);
|
|
||||||
total_filesize += len;
|
|
||||||
}
|
|
||||||
|
|
||||||
dst.close();
|
|
||||||
Log.v("MinetestAssetCopy", "Copied file: " +
|
|
||||||
m_tocopy.get(i) + " (" + total_filesize +
|
|
||||||
" bytes)");
|
|
||||||
} else if (len < 0) {
|
|
||||||
Log.e("MinetestAssetCopy", "Copying file: " +
|
|
||||||
m_tocopy.get(i) + " failed, size < 0");
|
|
||||||
}
|
|
||||||
src.close();
|
|
||||||
} catch (IOException e) {
|
|
||||||
Log.e("MinetestAssetCopy", "Copying file: " +
|
|
||||||
m_tocopy.get(i) + " failed");
|
|
||||||
e.printStackTrace();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return "";
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* update progress bar
|
|
||||||
*/
|
|
||||||
protected void onProgressUpdate(Integer... progress) {
|
|
||||||
|
|
||||||
if (m_copy_started) {
|
|
||||||
String todisplay = m_tocopy.get(progress[0]);
|
|
||||||
m_ProgressBar.setProgress(progress[0]);
|
|
||||||
m_Filename.setText(todisplay);
|
|
||||||
} else {
|
|
||||||
String todisplay = m_Foldername;
|
|
||||||
String full_text = "scanning " + todisplay + " ...";
|
|
||||||
m_Filename.setText(full_text);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* check all files and folders in filelist
|
|
||||||
*/
|
|
||||||
void ProcessFileList() {
|
|
||||||
String FlashBaseDir =
|
|
||||||
Environment.getExternalStorageDirectory().getAbsolutePath();
|
|
||||||
|
|
||||||
for (String current_path : m_filenames) {
|
|
||||||
String FlashPath = FlashBaseDir + "/" + current_path;
|
|
||||||
|
|
||||||
if (isAssetFolder(current_path)) {
|
|
||||||
/* store information and update gui */
|
|
||||||
m_Foldername = current_path;
|
|
||||||
publishProgress(0);
|
|
||||||
|
|
||||||
/* open file in order to check if it's a folder */
|
|
||||||
File current_folder = new File(FlashPath);
|
|
||||||
if (!current_folder.exists()) {
|
|
||||||
if (!current_folder.mkdirs()) {
|
|
||||||
Log.e("MinetestAssetCopy", "\t failed create folder: " +
|
|
||||||
FlashPath);
|
|
||||||
} else {
|
|
||||||
Log.v("MinetestAssetCopy", "\t created folder: " +
|
|
||||||
FlashPath);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* if it's not a folder it's most likely a file */
|
|
||||||
boolean refresh = true;
|
|
||||||
|
|
||||||
File testme = new File(FlashPath);
|
|
||||||
|
|
||||||
long asset_filesize = -1;
|
|
||||||
long stored_filesize;
|
|
||||||
|
|
||||||
if (testme.exists()) {
|
|
||||||
try {
|
|
||||||
AssetFileDescriptor fd = getAssets().openFd(current_path);
|
|
||||||
asset_filesize = fd.getLength();
|
|
||||||
fd.close();
|
|
||||||
} catch (IOException e) {
|
|
||||||
m_asset_size_unknown.add(current_path);
|
|
||||||
Log.e("MinetestAssetCopy", "Failed to open asset file \"" +
|
|
||||||
FlashPath + "\" for size check");
|
|
||||||
}
|
|
||||||
|
|
||||||
stored_filesize = testme.length();
|
|
||||||
|
|
||||||
if (asset_filesize == stored_filesize)
|
|
||||||
refresh = false;
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
if (refresh)
|
|
||||||
m_tocopy.add(current_path);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* read list of folders prepared on package build
|
|
||||||
*/
|
|
||||||
void BuildFolderList() {
|
|
||||||
try {
|
|
||||||
InputStream is = getAssets().open("index.txt");
|
|
||||||
BufferedReader reader = new BufferedReader(new InputStreamReader(is));
|
|
||||||
|
|
||||||
String line = reader.readLine();
|
|
||||||
while (line != null) {
|
|
||||||
m_foldernames.add(line);
|
|
||||||
line = reader.readLine();
|
|
||||||
}
|
|
||||||
is.close();
|
|
||||||
} catch (IOException e1) {
|
|
||||||
Log.e("MinetestAssetCopy", "Error on processing index.txt");
|
|
||||||
e1.printStackTrace();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* read list of asset files prepared on package build
|
|
||||||
*/
|
|
||||||
void BuildFileList() {
|
|
||||||
long entrycount = 0;
|
|
||||||
try {
|
|
||||||
InputStream is = getAssets().open("filelist.txt");
|
|
||||||
BufferedReader reader = new BufferedReader(new InputStreamReader(is));
|
|
||||||
|
|
||||||
String line = reader.readLine();
|
|
||||||
while (line != null) {
|
|
||||||
m_filenames.add(line);
|
|
||||||
line = reader.readLine();
|
|
||||||
entrycount++;
|
|
||||||
}
|
|
||||||
is.close();
|
|
||||||
} catch (IOException e1) {
|
|
||||||
Log.e("MinetestAssetCopy", "Error on processing filelist.txt");
|
|
||||||
e1.printStackTrace();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
protected void onPostExecute(String result) {
|
|
||||||
finish();
|
|
||||||
}
|
|
||||||
|
|
||||||
boolean isAssetFolder(String path) {
|
|
||||||
return m_foldernames.contains(path);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,87 +0,0 @@
|
|||||||
package net.minetest.minetest;
|
|
||||||
|
|
||||||
import android.app.Activity;
|
|
||||||
import android.app.AlertDialog;
|
|
||||||
import android.content.DialogInterface;
|
|
||||||
import android.content.Intent;
|
|
||||||
import android.os.Bundle;
|
|
||||||
import android.text.InputType;
|
|
||||||
import android.view.KeyEvent;
|
|
||||||
import android.view.View;
|
|
||||||
import android.view.View.OnKeyListener;
|
|
||||||
import android.widget.EditText;
|
|
||||||
|
|
||||||
public class MinetestTextEntry extends Activity {
|
|
||||||
private final int MultiLineTextInput = 1;
|
|
||||||
private final int SingleLineTextInput = 2;
|
|
||||||
private final int SingleLinePasswordInput = 3;
|
|
||||||
private AlertDialog mTextInputDialog;
|
|
||||||
private EditText mTextInputWidget;
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void onCreate(Bundle savedInstanceState) {
|
|
||||||
super.onCreate(savedInstanceState);
|
|
||||||
Bundle b = getIntent().getExtras();
|
|
||||||
String acceptButton = b.getString("EnterButton");
|
|
||||||
String hint = b.getString("hint");
|
|
||||||
String current = b.getString("current");
|
|
||||||
int editType = b.getInt("editType");
|
|
||||||
|
|
||||||
AlertDialog.Builder builder = new AlertDialog.Builder(this);
|
|
||||||
mTextInputWidget = new EditText(this);
|
|
||||||
mTextInputWidget.setHint(hint);
|
|
||||||
mTextInputWidget.setText(current);
|
|
||||||
mTextInputWidget.setMinWidth(300);
|
|
||||||
if (editType == SingleLinePasswordInput) {
|
|
||||||
mTextInputWidget.setInputType(InputType.TYPE_CLASS_TEXT |
|
|
||||||
InputType.TYPE_TEXT_VARIATION_PASSWORD);
|
|
||||||
} else {
|
|
||||||
mTextInputWidget.setInputType(InputType.TYPE_CLASS_TEXT);
|
|
||||||
}
|
|
||||||
|
|
||||||
builder.setView(mTextInputWidget);
|
|
||||||
|
|
||||||
if (editType == MultiLineTextInput) {
|
|
||||||
builder.setPositiveButton(acceptButton, new DialogInterface.OnClickListener() {
|
|
||||||
public void onClick(DialogInterface dialog, int whichButton) {
|
|
||||||
pushResult(mTextInputWidget.getText().toString());
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
builder.setOnCancelListener(new DialogInterface.OnCancelListener() {
|
|
||||||
public void onCancel(DialogInterface dialog) {
|
|
||||||
cancelDialog();
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
mTextInputWidget.setOnKeyListener(new OnKeyListener() {
|
|
||||||
@Override
|
|
||||||
public boolean onKey(View view, int KeyCode, KeyEvent event) {
|
|
||||||
if (KeyCode == KeyEvent.KEYCODE_ENTER) {
|
|
||||||
|
|
||||||
pushResult(mTextInputWidget.getText().toString());
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
mTextInputDialog = builder.create();
|
|
||||||
mTextInputDialog.show();
|
|
||||||
}
|
|
||||||
|
|
||||||
private void pushResult(String text) {
|
|
||||||
Intent resultData = new Intent();
|
|
||||||
resultData.putExtra("text", text);
|
|
||||||
setResult(Activity.RESULT_OK, resultData);
|
|
||||||
mTextInputDialog.dismiss();
|
|
||||||
finish();
|
|
||||||
}
|
|
||||||
|
|
||||||
private void cancelDialog() {
|
|
||||||
setResult(Activity.RESULT_CANCELED);
|
|
||||||
mTextInputDialog.dismiss();
|
|
||||||
finish();
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,24 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
|
||||||
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
|
||||||
android:id="@+id/activity_main"
|
|
||||||
android:layout_width="match_parent"
|
|
||||||
android:layout_height="match_parent">
|
|
||||||
|
|
||||||
<ProgressBar
|
|
||||||
android:id="@+id/progressBar1"
|
|
||||||
style="?android:attr/progressBarStyleHorizontal"
|
|
||||||
android:layout_width="match_parent"
|
|
||||||
android:layout_height="30dp"
|
|
||||||
android:layout_centerInParent="true"
|
|
||||||
android:layout_marginLeft="90dp"
|
|
||||||
android:layout_marginRight="90dp" />
|
|
||||||
|
|
||||||
<TextView
|
|
||||||
android:id="@+id/textView1"
|
|
||||||
android:layout_width="wrap_content"
|
|
||||||
android:layout_height="wrap_content"
|
|
||||||
android:layout_below="@+id/progressBar1"
|
|
||||||
android:layout_centerInParent="true"
|
|
||||||
android:text="@string/preparing_media" />
|
|
||||||
|
|
||||||
</RelativeLayout>
|
|
@ -1,17 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
|
||||||
<resources xmlns:tools="http://schemas.android.com/tools">
|
|
||||||
|
|
||||||
<style name="AppTheme" parent="android:Theme.Material.Light.NoActionBar.Fullscreen">
|
|
||||||
<item name="android:windowNoTitle">true</item>
|
|
||||||
<item name="android:windowBackground">@drawable/bg</item>
|
|
||||||
<item name="android:windowLayoutInDisplayCutoutMode" tools:ignore="NewApi" tools:targetApi="o_mr1">
|
|
||||||
shortEdges
|
|
||||||
</item>
|
|
||||||
</style>
|
|
||||||
|
|
||||||
<style name="Theme.Dialog" parent="@android:style/Theme.Material.Light.Dialog.NoActionBar">
|
|
||||||
<item name="android:windowNoTitle">true</item>
|
|
||||||
<item name="android:windowBackground">@android:color/transparent</item>
|
|
||||||
</style>
|
|
||||||
|
|
||||||
</resources>
|
|
@ -1,5 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
|
||||||
<resources>
|
|
||||||
<string name="preparing_media">Preparing media…</string>
|
|
||||||
<string name="not_granted">Required permission wasn\'t granted, Minetest can\'t run without it</string>
|
|
||||||
</resources>
|
|
@ -1,14 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
|
||||||
<resources>
|
|
||||||
|
|
||||||
<style name="AppTheme" parent="android:Theme.Holo.Light.NoActionBar.Fullscreen">
|
|
||||||
<item name="android:windowNoTitle">true</item>
|
|
||||||
<item name="android:windowBackground">@drawable/bg</item>
|
|
||||||
</style>
|
|
||||||
|
|
||||||
<style name="Theme.Dialog" parent="android:Theme.Holo.Light.Dialog.NoActionBar">
|
|
||||||
<item name="android:windowNoTitle">true</item>
|
|
||||||
<item name="android:windowBackground">@android:color/transparent</item>
|
|
||||||
</style>
|
|
||||||
|
|
||||||
</resources>
|
|
@ -1,6 +1,5 @@
|
|||||||
Minetest Android port
|
Minetest: Android version
|
||||||
=====================
|
=========================
|
||||||
Date: 2014 06 28
|
|
||||||
|
|
||||||
Controls
|
Controls
|
||||||
--------
|
--------
|
||||||
@ -40,25 +39,6 @@ file can usually be found at /mnt/sdcard/Minetest.
|
|||||||
main menu is too big or small on your device, try changing this
|
main menu is too big or small on your device, try changing this
|
||||||
value.
|
value.
|
||||||
|
|
||||||
Known issues
|
|
||||||
------------
|
|
||||||
Not all issues are fixed by now:
|
|
||||||
|
|
||||||
* Unable to exit from volume menu -- don't use the volume menu, use Android's
|
|
||||||
volume controls instead.
|
|
||||||
* 512 MB RAM seems to be inadequate -- this depends on the server you join.
|
|
||||||
Try to play on more lightweight servers.
|
|
||||||
|
|
||||||
Versioning
|
|
||||||
----------
|
|
||||||
Android version numbers are 4 digits instead of Minetest's 3 digits. The last
|
|
||||||
number of Android's version represents the Android internal version code. This
|
|
||||||
version code is strictly incremental. It's incremented for each official
|
|
||||||
Minetest Android build.
|
|
||||||
|
|
||||||
E.g. prerelease Minetest Android builds have been 0.4.9.3, while the first
|
|
||||||
official version most likely will be 0.4.10.4
|
|
||||||
|
|
||||||
Requirements
|
Requirements
|
||||||
------------
|
------------
|
||||||
|
|
||||||
@ -69,9 +49,9 @@ following software packages. The version number in parenthesis denotes the
|
|||||||
version that was tested at the time this README was drafted; newer/older
|
version that was tested at the time this README was drafted; newer/older
|
||||||
versions may or may not work.
|
versions may or may not work.
|
||||||
|
|
||||||
* android SDK (api-26)
|
* Android SDK 29
|
||||||
* android NDK (r17c)
|
* Android NDK r21
|
||||||
* wget (1.13.4)
|
* Android Studio 3 [optional]
|
||||||
|
|
||||||
Additionally, you'll need to have an Internet connection available on the
|
Additionally, you'll need to have an Internet connection available on the
|
||||||
build system, as the Android build will download some source packages.
|
build system, as the Android build will download some source packages.
|
||||||
@ -79,16 +59,15 @@ build system, as the Android build will download some source packages.
|
|||||||
Build
|
Build
|
||||||
-----
|
-----
|
||||||
|
|
||||||
Debug build:
|
The new build system Minetest Android is fully functional and is designed to
|
||||||
* Enter "build/android" subdirectory
|
speed up and simplify the work, as well as adding the possibility of
|
||||||
* Execute "make"
|
cross-platform build.
|
||||||
* Answer the questions about where SDK and NDK are located on your filesystem
|
You can use `./gradlew assemblerelease` or `./gradlew assembledebug` from the
|
||||||
* Wait for build to finish
|
command line or use Android Studio and click the build button.
|
||||||
|
|
||||||
After the build is finished, the resulting apk can be fond in
|
When using gradlew, the newest NDK will be downloaded and installed
|
||||||
build/android/bin/. It will be called Minetest-debug.apk
|
automatically. Or you can create a `local.properties` file and specify
|
||||||
|
`sdk.dir` and `ndk.dir` yourself.
|
||||||
Release build:
|
|
||||||
|
|
||||||
* In order to make a release build you'll have to have a keystore setup to sign
|
* In order to make a release build you'll have to have a keystore setup to sign
|
||||||
the resulting apk package. How this is done is not part of this README. There
|
the resulting apk package. How this is done is not part of this README. There
|
||||||
@ -100,29 +79,3 @@ Release build:
|
|||||||
|
|
||||||
> key.store=<path to your keystore>
|
> key.store=<path to your keystore>
|
||||||
> key.alias=Minetest
|
> key.alias=Minetest
|
||||||
|
|
||||||
* Execute "make release"
|
|
||||||
* Enter your keystore as well as your Mintest key password once asked. Be
|
|
||||||
careful it's shown on console in clear text!
|
|
||||||
* The result can be found at "bin/Minetest-release.apk"
|
|
||||||
|
|
||||||
Other things that may be nice to know
|
|
||||||
------------
|
|
||||||
* The environment for Android development tools is saved within Android build
|
|
||||||
build folder. If you want direct access to it do:
|
|
||||||
|
|
||||||
> make envpaths
|
|
||||||
> . and_env
|
|
||||||
|
|
||||||
After you've done this you'll have your path and path variables set correct
|
|
||||||
to use adb and all other Android development tools
|
|
||||||
|
|
||||||
* You can build a single dependency by calling make and the dependency's name,
|
|
||||||
e.g.:
|
|
||||||
|
|
||||||
> make irrlicht
|
|
||||||
|
|
||||||
* You can completely cleanup a dependency by calling make and the "clean" target,
|
|
||||||
e.g.:
|
|
||||||
|
|
||||||
> make clean_irrlicht
|
|
||||||
|
@ -11,11 +11,11 @@
|
|||||||
|
|
||||||
#if defined USE_CMAKE_CONFIG_H
|
#if defined USE_CMAKE_CONFIG_H
|
||||||
#include "cmake_config.h"
|
#include "cmake_config.h"
|
||||||
#elif defined (__ANDROID__) || defined (ANDROID)
|
#elif defined (__ANDROID__)
|
||||||
#define PROJECT_NAME "minetest"
|
#define PROJECT_NAME "minetest"
|
||||||
#define PROJECT_NAME_C "Minetest"
|
#define PROJECT_NAME_C "Minetest"
|
||||||
#define STATIC_SHAREDIR ""
|
#define STATIC_SHAREDIR ""
|
||||||
#include "android_version.h"
|
#define VERSION_STRING STR(VERSION_MAJOR) "." STR(VERSION_MINOR) "." STR(VERSION_PATCH) STR(VERSION_EXTRA)
|
||||||
#ifdef NDEBUG
|
#ifdef NDEBUG
|
||||||
#define BUILD_TYPE "Release"
|
#define BUILD_TYPE "Release"
|
||||||
#else
|
#else
|
||||||
|
@ -457,7 +457,6 @@ static bool create_userdata_path()
|
|||||||
} else {
|
} else {
|
||||||
success = true;
|
success = true;
|
||||||
}
|
}
|
||||||
porting::copyAssets();
|
|
||||||
#else
|
#else
|
||||||
// Create user data directory
|
// Create user data directory
|
||||||
success = fs::CreateDir(porting::path_user);
|
success = fs::CreateDir(porting::path_user);
|
||||||
|
@ -69,10 +69,10 @@ void android_main(android_app *app)
|
|||||||
/* TODO this doesn't work as expected, no idea why but there's a workaround */
|
/* TODO this doesn't work as expected, no idea why but there's a workaround */
|
||||||
/* for it right now */
|
/* for it right now */
|
||||||
extern "C" {
|
extern "C" {
|
||||||
JNIEXPORT void JNICALL Java_net_minetest_MtNativeActivity_putMessageBoxResult(
|
JNIEXPORT void JNICALL Java_net_minetest_minetest_GameActivity_putMessageBoxResult(
|
||||||
JNIEnv * env, jclass thiz, jstring text)
|
JNIEnv * env, jclass thiz, jstring text)
|
||||||
{
|
{
|
||||||
errorstream << "Java_net_minetest_MtNativeActivity_putMessageBoxResult got: "
|
errorstream << "Java_net_minetest_minetest_GameActivity_putMessageBoxResult got: "
|
||||||
<< std::string((const char*)env->GetStringChars(text,0))
|
<< std::string((const char*)env->GetStringChars(text,0))
|
||||||
<< std::endl;
|
<< std::endl;
|
||||||
}
|
}
|
||||||
@ -107,17 +107,6 @@ jclass findClass(std::string classname)
|
|||||||
return (jclass) jnienv->CallObjectMethod(cls, findClass, strClassName);
|
return (jclass) jnienv->CallObjectMethod(cls, findClass, strClassName);
|
||||||
}
|
}
|
||||||
|
|
||||||
void copyAssets()
|
|
||||||
{
|
|
||||||
jmethodID assetcopy = jnienv->GetMethodID(nativeActivity,"copyAssets","()V");
|
|
||||||
|
|
||||||
if (assetcopy == 0) {
|
|
||||||
assert("porting::copyAssets unable to find copy assets method" == 0);
|
|
||||||
}
|
|
||||||
|
|
||||||
jnienv->CallVoidMethod(app_global->activity->clazz, assetcopy);
|
|
||||||
}
|
|
||||||
|
|
||||||
void initAndroid()
|
void initAndroid()
|
||||||
{
|
{
|
||||||
porting::jnienv = NULL;
|
porting::jnienv = NULL;
|
||||||
@ -136,7 +125,7 @@ void initAndroid()
|
|||||||
exit(-1);
|
exit(-1);
|
||||||
}
|
}
|
||||||
|
|
||||||
nativeActivity = findClass("net/minetest/minetest/MtNativeActivity");
|
nativeActivity = findClass("net/minetest/minetest/GameActivity");
|
||||||
if (nativeActivity == 0) {
|
if (nativeActivity == 0) {
|
||||||
errorstream <<
|
errorstream <<
|
||||||
"porting::initAndroid unable to find java native activity class" <<
|
"porting::initAndroid unable to find java native activity class" <<
|
||||||
|
@ -48,11 +48,6 @@ void cleanupAndroid();
|
|||||||
*/
|
*/
|
||||||
void initializePathsAndroid();
|
void initializePathsAndroid();
|
||||||
|
|
||||||
/**
|
|
||||||
* use java function to copy media from assets to external storage
|
|
||||||
*/
|
|
||||||
void copyAssets();
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* show text input dialog in java
|
* show text input dialog in java
|
||||||
* @param acceptButton text to display on accept button
|
* @param acceptButton text to display on accept button
|
||||||
|
@ -20,10 +20,7 @@ with this program; if not, write to the Free Software Foundation, Inc.,
|
|||||||
#include "version.h"
|
#include "version.h"
|
||||||
#include "config.h"
|
#include "config.h"
|
||||||
|
|
||||||
#if defined(__ANDROID__)
|
#if USE_CMAKE_CONFIG_H
|
||||||
#include "android_version.h"
|
|
||||||
#include "android_version_githash.h"
|
|
||||||
#elif defined(USE_CMAKE_CONFIG_H)
|
|
||||||
#include "cmake_config_githash.h"
|
#include "cmake_config_githash.h"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user