diff --git a/.gitignore b/.gitignore index 00a6af0..11676fc 100644 --- a/.gitignore +++ b/.gitignore @@ -13,3 +13,6 @@ gostcoind gostcoin-qt_plugin_import.cpp object_script.gostcoin-qt.Debug object_script.gostcoin-qt.Release +.project +.cproject +build* diff --git a/android/.gitignore b/android/.gitignore new file mode 100644 index 0000000..c3c36c3 --- /dev/null +++ b/android/.gitignore @@ -0,0 +1,2 @@ +local.properties +*.pro.user* \ No newline at end of file diff --git a/android/AndroidManifest.xml b/android/AndroidManifest.xml new file mode 100644 index 0000000..9d0fb68 --- /dev/null +++ b/android/AndroidManifest.xml @@ -0,0 +1,75 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/android/build.gradle b/android/build.gradle new file mode 100644 index 0000000..ef416b0 --- /dev/null +++ b/android/build.gradle @@ -0,0 +1,57 @@ +buildscript { + repositories { + jcenter() + } + + dependencies { + classpath 'com.android.tools.build:gradle:1.1.0' + } +} + +allprojects { + repositories { + jcenter() + } +} + +apply plugin: 'com.android.application' + +dependencies { + compile fileTree(dir: 'libs', include: ['*.jar']) +} + +android { + /******************************************************* + * The following variables: + * - androidBuildToolsVersion, + * - androidCompileSdkVersion + * - qt5AndroidDir - holds the path to qt android files + * needed to build any Qt application + * on Android. + * + * are defined in gradle.properties file. This file is + * updated by QtCreator and androiddeployqt tools. + * Changing them manually might break the compilation! + *******************************************************/ + + compileSdkVersion androidCompileSdkVersion.toInteger() + + buildToolsVersion androidBuildToolsVersion + + sourceSets { + main { + manifest.srcFile 'AndroidManifest.xml' + java.srcDirs = [qt5AndroidDir + '/src', 'src', 'java'] + aidl.srcDirs = [qt5AndroidDir + '/src', 'src', 'aidl'] + res.srcDirs = [qt5AndroidDir + '/res', 'res'] + resources.srcDirs = ['src'] + renderscript.srcDirs = ['src'] + assets.srcDirs = ['assets'] + jniLibs.srcDirs = ['libs'] + } + } + + lintOptions { + abortOnError false + } +} diff --git a/android/gostcoin-qt-android.pro b/android/gostcoin-qt-android.pro new file mode 100644 index 0000000..0ee756e --- /dev/null +++ b/android/gostcoin-qt-android.pro @@ -0,0 +1,491 @@ +TEMPLATE = app +TARGET = gostcoin-qt +VERSION = 0.8.5.8 +INCLUDEPATH += ../src ../src/json ../src/qt ../i2psam +QT += core gui network androidextras +greaterThan(QT_MAJOR_VERSION, 4): QT += widgets +DEFINES += QT_GUI BOOST_THREAD_USE_LIB BOOST_SPIRIT_THREADSAFE BOOST_NO_CXX11_SCOPED_ENUMS +CONFIG += no_include_pwd +CONFIG += thread +QMAKE_CXXFLAGS=-fstack-protector-strong -DANDROID -fno-builtin-memmove --sysroot=/home/user/SDKS/ANDROID/NDK/android-ndk-r13b/platforms/android-9/arch-arm/ -std=c++11 + +# for boost 1.37, add -mt to the boost libraries +# use: qmake BOOST_LIB_SUFFIX=-mt +# for boost thread win32 with _win32 sufix +# use: BOOST_THREAD_LIB_SUFFIX=_win32-... +# or when linking against a specific BerkelyDB version: BDB_LIB_SUFFIX=-4.8 + +# Dependency library locations can be customized with: +# BOOST_INCLUDE_PATH, BOOST_LIB_PATH, BDB_INCLUDE_PATH, +# BDB_LIB_PATH, OPENSSL_INCLUDE_PATH and OPENSSL_LIB_PATH respectively + +OBJECTS_DIR = build +MOC_DIR = build +UI_DIR = build + +USE_IPV6=0 +USE_LEVELDB=1 +USE_ASM=1 + +android { + message("Using Android settings") + + # change to your own path, where you will store all needed libraries with 'git clone' commands below. + MAIN_PATH = /path/to/libraries + # change to your own Android NDK path + NDK_PATH = /home/user/SDKS/ANDROID/NDK/android-ndk-r13b + + # git clone https://github.com/PurpleI2P/MiniUPnP-for-Android-Prebuilt.git + # git clone git@github.com:hypnosis-i2p/android-ifaddrs-from-android-source.git + #boost 53, 62 are not ok + BOOST_PATH = $$MAIN_PATH/take3/boost_1_57_0 +#/stage/lib + OPENSSL_PATH = $$MAIN_PATH/take3/openssl-1.0.2l + #MINIUPNP_PATH = $$MAIN_PATH/MiniUPnP-for-Android-Prebuilt + IFADDRS_PATH = $$MAIN_PATH/android-ifaddrs-from-android-source + BDB_PATH = $$MAIN_PATH/take3/db-6.0.20/build_unix + + DEFINES += ANDROID=1 + DEFINES += __ANDROID__ + + CONFIG += mobility + + MOBILITY = + + INCLUDEPATH += \ + $$NDK_PATH/sources/cxx-stl/gnu-libstdc++/4.9/include \ + $$NDK_PATH/sources/cxx-stl/gnu-libstdc++/4.9/libs/armeabi-v7a/include \ + $$BOOST_PATH \ + $$OPENSSL_PATH/include \ + $$IFADDRS_PATH \ + $$BDB_PATH \ + build +# $$NDK_PATH/platforms/android-9/arch-arm/usr/include/ \ +# $$NDK_PATH/sources/cxx-stl/stlport/stlport/ -I $NDK_PATH/sources/cxx-stl/system/include/ + +#\ +# $$MINIUPNP_PATH/miniupnp-2.0/include \ + DISTFILES += AndroidManifest.xml + + ANDROID_PACKAGE_SOURCE_DIR = $$PWD/ + + SOURCES += $$IFADDRS_PATH/ifaddrs.cpp $$IFADDRS_PATH/bionic_netlink.cpp + HEADERS += $$IFADDRS_PATH/ifaddrs.h $$IFADDRS_PATH/ErrnoRestorer.h $$IFADDRS_PATH/bionic_netlink.h $$IFADDRS_PATH/bionic_macros.h + + equals(ANDROID_TARGET_ARCH, armeabi-v7a){ + DEFINES += ANDROID_ARM7A + # http://stackoverflow.com/a/30235934/529442 +# LIBS += -L$$BOOST_PATH/boost_1_53_0/armeabi-v7a/lib \ +# -lboost_system-gcc-mt-1_53 -lboost_atomic-gcc-mt-1_53 \ +# -lboost_filesystem-gcc-mt-1_53 -lboost_chrono-gcc-mt-1_53 -lboost_thread-gcc-mt-1_53 -lboost_program_options-gcc-mt-1_53 \ +# -L$$OPENSSL_PATH/armeabi-v7a/lib/ -lcrypto -lssl +#\ +# -L$$MINIUPNP_PATH/miniupnp-2.0/armeabi-v7a/lib/ -lminiupnpc + BOOST_POSTFIX=-gcc-mt-1_57 + LIBS += -L$$BOOST_PATH/stage/lib \ + -lboost_atomic$$BOOST_POSTFIX \ + -lboost_chrono$$BOOST_POSTFIX \ + -lboost_filesystem$$BOOST_POSTFIX \ + -lboost_program_options$$BOOST_POSTFIX \ + -lboost_system$$BOOST_POSTFIX \ + -lboost_thread$$BOOST_POSTFIX \ + -L$$OPENSSL_PATH -lcrypto -lssl +#\ +# -L$$MINIUPNP_PATH/miniupnp-2.0/armeabi-v7a/lib/ -lminiupnpc + + PRE_TARGETDEPS += $$OPENSSL_PATH/libcrypto.a \ + $$OPENSSL_PATH/libssl.a + DEPENDPATH += $$OPENSSL_PATH/include + +# ANDROID_EXTRA_LIBS += $$OPENSSL_PATH/armeabi-v7a/lib/libcrypto_1_0_0.so \ +# $$OPENSSL_PATH/armeabi-v7a/lib/libssl_1_0_0.so +#\ +# $$MINIUPNP_PATH/miniupnp-2.0/armeabi-v7a/lib/libminiupnpc.so + } + + equals(ANDROID_TARGET_ARCH, x86){ + error("Android BDB: don't know how to build BDB for Android x86") + + # http://stackoverflow.com/a/30235934/529442 + LIBS += -L$$BOOST_PATH/boost_1_62_0/x86/lib \ + -lboost_system-gcc-mt-1_62 -lboost_date_time-gcc-mt-1_62 \ + -lboost_filesystem-gcc-mt-1_62 -lboost_program_options-gcc-mt-1_62 \ + -L$$OPENSSL_PATH/openssl-1.1.0/x86/lib/ -lcrypto -lssl +#\ +# -L$$MINIUPNP_PATH/miniupnp-2.0/x86/lib/ -lminiupnpc + + PRE_TARGETDEPS += $$OPENSSL_PATH/openssl-1.1.0/x86/lib/libcrypto.a \ + $$OPENSSL_PATH/openssl-1.1.0/x86/lib/libssl.a + + DEPENDPATH += $$OPENSSL_PATH/openssl-1.1.0/include + + ANDROID_EXTRA_LIBS += $$OPENSSL_PATH/openssl-1.1.0/x86/lib/libcrypto_1_0_0.so \ + $$OPENSSL_PATH/openssl-1.1.0/x86/lib/libssl_1_0_0.so +#\ +# $$MINIUPNP_PATH/miniupnp-2.0/x86/lib/libminiupnpc.so + } +} + +!win32 { + # for extra security against potential buffer overflows: enable GCCs Stack Smashing Protection +# QMAKE_CXXFLAGS *= -fstack-protector-all +# QMAKE_CFLAGS *= -fstack-protector-all +# QMAKE_LFLAGS *= -fstack-protector-all + # Exclude on Windows cross compile with MinGW 4.2.x, as it will result in a non-working executable! + # This can be enabled for Windows, when we switch to MinGW >= 4.4.x. +} +# for extra security (see: https://wiki.debian.org/Hardening): this flag is GCC compiler-specific +#-D_FORTIFY_SOURCE=2 +QMAKE_CXXFLAGS *= -std=c++11 + +# use: qmake "USE_QRCODE=1" +# libqrencode (http://fukuchi.org/works/qrencode/index.en.html) must be installed for support +contains(USE_QRCODE, 1) { + message(Building with QRCode support) + DEFINES += USE_QRCODE + LIBS += -lqrencode +} + +# use: qmake "USE_DBUS=1" +contains(USE_DBUS, 1) { + message(Building with DBUS (Freedesktop notifications) support) + DEFINES += USE_DBUS + QT += dbus +} + +# use: qmake "USE_IPV6=1" ( enabled by default; default) +# or: qmake "USE_IPV6=0" (disabled by default) +# or: qmake "USE_IPV6=-" (not supported) +contains(USE_IPV6, -) { + message(Building without IPv6 support) +} else { + count(USE_IPV6, 0) { + USE_IPV6=1 + } + DEFINES += USE_IPV6=$$USE_IPV6 +} + +contains(BITCOIN_NEED_QT_PLUGINS, 1) { + DEFINES += BITCOIN_NEED_QT_PLUGINS + QTPLUGIN += qcncodecs qjpcodecs qtwcodecs qkrcodecs qtaccessiblewidgets +} + +INCLUDEPATH += ../src/leveldb/include ../src/leveldb/helpers +LIBS += $$PWD/../src/leveldb/libleveldb.a $$PWD/../src/leveldb/libmemenv.a +!win32 { + # we use QMAKE_CXXFLAGS_RELEASE even without RELEASE=1 because we use RELEASE to indicate linking preferences not -O preferences + !android { + genleveldb.commands = echo "QMAKE_CXXFLAGS $$QMAKE_CXXFLAGS" && cd $$PWD/../src/leveldb && TARGET_OS=OS_ANDROID_CROSSCOMPILE CC=$$QMAKE_CC CXX=$$QMAKE_CXX AR=$$NDK_PATH/toolchains/arm-linux-androideabi-4.9/prebuilt/linux-x86_64/bin/arm-linux-androideabi-ar $(MAKE) OPT=\"-I $$NDK_PATH/platforms/android-9/arch-arm/usr/include/ -I $$NDK_PATH/sources/cxx-stl/gnu-libstdc++/4.9/include -I $$NDK_PATH/sources/cxx-stl/gnu-libstdc++/4.9/libs/armeabi-v7a/include/ $$QMAKE_CXXFLAGS \" libleveldb.a libmemenv.a + } +} +genleveldb.target = $$PWD/../src/leveldb/libleveldb.a +genleveldb.depends = FORCE +PRE_TARGETDEPS += $$PWD/../src/leveldb/libleveldb.a +QMAKE_EXTRA_TARGETS += genleveldb +# Gross ugly hack that depends on qmake internals, unfortunately there is no other way to do it. +QMAKE_CLEAN += $$PWD/../src/leveldb/libleveldb.a; cd $$PWD/../src/leveldb ; $(MAKE) clean + +# regenerate ../src/build.h +#!win32|contains(USE_BUILD_INFO, 1) { +# genbuild.depends = FORCE +# genbuild.commands = cd $$PWD; /bin/sh ../share/genbuild.sh $$OUT_PWD/build/build.h +# genbuild.target = $$OUT_PWD/build/build.h +# PRE_TARGETDEPS += $$OUT_PWD/build/build.h +# QMAKE_EXTRA_TARGETS += genbuild +# DEFINES += HAVE_BUILD_INFO +#} + +QMAKE_CXXFLAGS_WARN_ON = -fdiagnostics-show-option -Wall -Wextra -Wformat -Wformat-security -Wno-unused-parameter -Wstack-protector + +# Input +DEPENDPATH += ../src ../src/json ../src/qt +HEADERS += ../src/qt/bitcoingui.h \ + ../src/qt/transactiontablemodel.h \ + ../src/qt/addresstablemodel.h \ + ../src/qt/optionsdialog.h \ + ../src/qt/sendcoinsdialog.h \ + ../src/qt/coincontroldialog.h \ + ../src/qt/coincontroltreewidget.h \ + ../src/qt/addressbookpage.h \ + ../src/qt/signverifymessagedialog.h \ + ../src/qt/aboutdialog.h \ + ../src/qt/editaddressdialog.h \ + ../src/qt/bitcoinaddressvalidator.h \ + ../src/alert.h \ + ../src/addrman.h \ + ../src/base58.h \ + ../src/bignum.h \ + ../src/checkpoints.h \ + ../src/coincontrol.h \ + ../src/compat.h \ + ../src/sync.h \ + ../src/util.h \ + ../src/hash.h \ + ../src/uint256.h \ + ../src/serialize.h \ + ../src/main.h \ + ../src/net.h \ + ../src/key.h \ + ../src/db.h \ + ../src/walletdb.h \ + ../src/script.h \ + ../src/init.h \ + ../src/bloom.h \ + ../src/mruset.h \ + ../src/checkqueue.h \ + ../src/json/json_spirit_writer_template.h \ + ../src/json/json_spirit_writer.h \ + ../src/json/json_spirit_value.h \ + ../src/json/json_spirit_utils.h \ + ../src/json/json_spirit_stream_reader.h \ + ../src/json/json_spirit_reader_template.h \ + ../src/json/json_spirit_reader.h \ + ../src/json/json_spirit_error_position.h \ + ../src/json/json_spirit.h \ + ../i2psam/i2psam.h \ + ../src/qt/clientmodel.h \ + ../src/qt/guiutil.h \ + ../src/qt/transactionrecord.h \ + ../src/qt/guiconstants.h \ + ../src/qt/optionsmodel.h \ + ../src/qt/monitoreddatamapper.h \ + ../src/qt/transactiondesc.h \ + ../src/qt/transactiondescdialog.h \ + ../src/qt/bitcoinamountfield.h \ + ../src/wallet.h \ + ../src/keystore.h \ + ../src/qt/transactionfilterproxy.h \ + ../src/qt/transactionview.h \ + ../src/qt/walletmodel.h \ + ../src/qt/walletview.h \ + ../src/qt/walletstack.h \ + ../src/qt/walletframe.h \ + ../src/bitcoinrpc.h \ + ../src/qt/overviewpage.h \ + ../src/qt/csvmodelwriter.h \ + ../src/crypter.h \ + ../src/qt/sendcoinsentry.h \ + ../src/qt/qvalidatedlineedit.h \ + ../src/qt/bitcoinunits.h \ + ../src/qt/qvaluecombobox.h \ + ../src/qt/askpassphrasedialog.h \ + ../src/protocol.h \ + ../src/qt/notificator.h \ + ../src/qt/paymentserver.h \ + ../src/allocators.h \ + ../src/ui_interface.h \ + ../src/qt/rpcconsole.h \ + ../src/i2p.h \ + ../src/Gost.h \ + ../src/version.h \ + ../src/netbase.h \ + ../src/clientversion.h \ + ../src/txdb.h \ + ../src/leveldb.h \ + ../src/threadsafety.h \ + ../src/limitedmap.h \ + ../src/qt/macnotificationhandler.h \ + ../src/qt/splashscreen.h \ + ../src/qt/showi2paddresses.h \ + ../src/qt/i2poptionswidget.h \ + ../src/qt/setupdarknet.h + +SOURCES += ../src/qt/gostcoin.cpp \ + ../src/qt/bitcoingui.cpp \ + ../src/qt/transactiontablemodel.cpp \ + ../src/qt/addresstablemodel.cpp \ + ../src/qt/optionsdialog.cpp \ + ../src/qt/sendcoinsdialog.cpp \ + ../src/qt/coincontroldialog.cpp \ + ../src/qt/coincontroltreewidget.cpp \ + ../src/qt/addressbookpage.cpp \ + ../src/qt/signverifymessagedialog.cpp \ + ../src/qt/aboutdialog.cpp \ + ../src/qt/editaddressdialog.cpp \ + ../src/qt/bitcoinaddressvalidator.cpp \ + ../src/alert.cpp \ + ../src/version.cpp \ + ../src/sync.cpp \ + ../src/util.cpp \ + ../src/hash.cpp \ + ../src/netbase.cpp \ + ../src/key.cpp \ + ../src/script.cpp \ + ../src/main.cpp \ + ../src/init.cpp \ + ../src/net.cpp \ + ../src/bloom.cpp \ + ../src/checkpoints.cpp \ + ../src/addrman.cpp \ + ../src/db.cpp \ + ../src/walletdb.cpp \ + ../src/qt/clientmodel.cpp \ + ../src/qt/guiutil.cpp \ + ../src/qt/transactionrecord.cpp \ + ../src/qt/optionsmodel.cpp \ + ../src/qt/monitoreddatamapper.cpp \ + ../src/qt/transactiondesc.cpp \ + ../src/qt/transactiondescdialog.cpp \ + ../src/qt/bitcoinstrings.cpp \ + ../src/qt/bitcoinamountfield.cpp \ + ../src/wallet.cpp \ + ../src/keystore.cpp \ + ../src/qt/transactionfilterproxy.cpp \ + ../src/qt/transactionview.cpp \ + ../src/qt/walletmodel.cpp \ + ../src/qt/walletview.cpp \ + ../src/qt/walletstack.cpp \ + ../src/qt/walletframe.cpp \ + ../src/bitcoinrpc.cpp \ + ../src/rpcdump.cpp \ + ../src/rpcnet.cpp \ + ../src/rpcmining.cpp \ + ../src/rpcwallet.cpp \ + ../src/rpcblockchain.cpp \ + ../src/rpcrawtransaction.cpp \ + ../src/qt/overviewpage.cpp \ + ../src/qt/csvmodelwriter.cpp \ + ../src/crypter.cpp \ + ../src/qt/sendcoinsentry.cpp \ + ../src/qt/qvalidatedlineedit.cpp \ + ../src/qt/bitcoinunits.cpp \ + ../src/qt/qvaluecombobox.cpp \ + ../src/qt/askpassphrasedialog.cpp \ + ../src/protocol.cpp \ + ../src/qt/notificator.cpp \ + ../src/qt/paymentserver.cpp \ + ../src/qt/rpcconsole.cpp \ + ../src/i2p.cpp \ + ../src/Gost.cpp \ + ../src/noui.cpp \ + ../src/leveldb.cpp \ + ../src/txdb.cpp \ + ../src/qt/splashscreen.cpp \ + ../src/qt/showi2paddresses.cpp \ + ../src/qt/i2poptionswidget.cpp \ + ../i2psam/i2psam.cpp \ + ../src/qt/setupdarknet.cpp + +RESOURCES += ../src/qt/bitcoin.qrc + +FORMS += ../src/qt/forms/sendcoinsdialog.ui \ + ../src/qt/forms/coincontroldialog.ui \ + ../src/qt/forms/addressbookpage.ui \ + ../src/qt/forms/signverifymessagedialog.ui \ + ../src/qt/forms/aboutdialog.ui \ + ../src/qt/forms/editaddressdialog.ui \ + ../src/qt/forms/transactiondescdialog.ui \ + ../src/qt/forms/overviewpage.ui \ + ../src/qt/forms/sendcoinsentry.ui \ + ../src/qt/forms/askpassphrasedialog.ui \ + ../src/qt/forms/rpcconsole.ui \ + ../src/qt/forms/optionsdialog.ui \ + ../src/qt/forms/showi2paddresses.ui \ + ../src/qt/forms/i2poptionswidget.ui + +contains(USE_QRCODE, 1) { +HEADERS += ../src/qt/qrcodedialog.h +SOURCES += ../src/qt/qrcodedialog.cpp +FORMS += ../src/qt/forms/qrcodedialog.ui +} + +contains(BITCOIN_QT_TEST, 1) { +SOURCES += ../src/qt/test/test_main.cpp \ + ../src/qt/test/uritests.cpp +HEADERS += ../src/qt/test/uritests.h +DEPENDPATH += ../src/qt/test +QT += testlib +TARGET = anoncoin-qt_test +DEFINES += BITCOIN_QT_TEST + macx: CONFIG -= app_bundle +} + +contains(USE_SSE2, 1) { +DEFINES += USE_SSE2 +gccsse2.input = SOURCES_SSE2 +gccsse2.output = $$PWD/build/${QMAKE_FILE_BASE}.o +gccsse2.commands = $(CXX) -c $(CXXFLAGS) $(INCPATH) -o ${QMAKE_FILE_OUT} ${QMAKE_FILE_NAME} -msse2 -mstackrealign +QMAKE_EXTRA_COMPILERS += gccsse2 +#SOURCES_SSE2 += ../src/scrypt-sse2.cpp +} + +greaterThan(QT_MAJOR_VERSION, 4): { +} else { + CODECFORTR = UTF-8 +} + +# for lrelease/lupdate +# also add new translations to ../src/qt/bitcoin.qrc under translations/ +TRANSLATIONS = $$files(../src/qt/locale/bitcoin_*.ts) + +isEmpty(QMAKE_LRELEASE) { + QMAKE_LRELEASE = $$[QT_INSTALL_BINS]/lrelease +} +isEmpty(QM_DIR):QM_DIR = $$PWD/../src/qt/locale +# automatically build translations, so they can be included in resource file +TSQM.name = lrelease ${QMAKE_FILE_IN} +TSQM.input = TRANSLATIONS +TSQM.output = $$QM_DIR/${QMAKE_FILE_BASE}.qm +TSQM.commands = $$QMAKE_LRELEASE ${QMAKE_FILE_IN} -qm ${QMAKE_FILE_OUT} +TSQM.CONFIG = no_link +QMAKE_EXTRA_COMPILERS += TSQM + +# "Other files" to show in Qt Creator +OTHER_FILES += README.md \ + doc/*.rst \ + doc/*.txt \ + doc/*.md \ + ../src/qt/res/bitcoin-qt.rc \ + ../src/test/*.cpp \ + ../src/test/*.h \ + ../src/qt/test/*.cpp \ + ../src/qt/test/*.h + +# platform specific defaults, if not overridden on command line + +isEmpty(BOOST_THREAD_LIB_SUFFIX) { + BOOST_THREAD_LIB_SUFFIX = $$BOOST_LIB_SUFFIX +} + +isEmpty(BDB_LIB_SUFFIX) { + android:BDB_LIB_SUFFIX = -6.0 +} + +!win32:!macx { + android { + #LIBS += $$BDB_PATH/libdb.a $$BDB_PATH/libdb_cxx.a + LIBS += -L$$BDB_PATH + } + # _FILE_OFFSET_BITS=64 lets 32-bit fopen transparently support large files. + DEFINES += _FILE_OFFSET_BITS=64 +} + +# Set libraries and includes at end, to use platform-defined defaults if not overridden +INCLUDEPATH += $$BOOST_INCLUDE_PATH $$BDB_INCLUDE_PATH $$OPENSSL_INCLUDE_PATH $$QRENCODE_INCLUDE_PATH +LIBS += $$join(BOOST_LIB_PATH,,-L,) $$join(BDB_LIB_PATH,,-L,) $$join(OPENSSL_LIB_PATH,,-L,) $$join(QRENCODE_LIB_PATH,,-L,) +LIBS += -lssl -lcrypto +LIBS += -lz +!win32:LIBS += -ldl + +android { + CXXFLAGS += -O0 -g +# LIBS += $$NDK_PATH/sources/cxx-stl/stlport/libs/armeabi-v7a/libstlport_static.a + LIBS +=$$BDB_PATH/libdb_cxx.a $$BDB_PATH/libdb.a +} + +system($$QMAKE_LRELEASE -silent $$TRANSLATIONS) + +android { + DISTFILES += \ + AndroidManifest.xml \ + res/values/libs.xml +} + +DISTFILES += \ + ../../../S2_ATHOME/git_gostcoin/gostcoin/android/AndroidManifest.xml \ + ../../../S2_ATHOME/git_gostcoin/gostcoin/android/res/values/libs.xml \ + ../../../S2_ATHOME/git_gostcoin/gostcoin/android/build.gradle \ + ../docs/gost_android_take3.txt + + + diff --git a/android/gradle/wrapper/gradle-wrapper.jar b/android/gradle/wrapper/gradle-wrapper.jar new file mode 100644 index 0000000..8c0fb64 Binary files /dev/null and b/android/gradle/wrapper/gradle-wrapper.jar differ diff --git a/android/gradle/wrapper/gradle-wrapper.properties b/android/gradle/wrapper/gradle-wrapper.properties new file mode 100644 index 0000000..1e61d1f --- /dev/null +++ b/android/gradle/wrapper/gradle-wrapper.properties @@ -0,0 +1,6 @@ +#Wed Apr 10 15:27:10 PDT 2013 +distributionBase=GRADLE_USER_HOME +distributionPath=wrapper/dists +zipStoreBase=GRADLE_USER_HOME +zipStorePath=wrapper/dists +distributionUrl=http\://services.gradle.org/distributions/gradle-1.12-all.zip diff --git a/android/gradlew b/android/gradlew new file mode 100755 index 0000000..91a7e26 --- /dev/null +++ b/android/gradlew @@ -0,0 +1,164 @@ +#!/usr/bin/env bash + +############################################################################## +## +## Gradle start up script for UN*X +## +############################################################################## + +# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +DEFAULT_JVM_OPTS="" + +APP_NAME="Gradle" +APP_BASE_NAME=`basename "$0"` + +# Use the maximum available, or set MAX_FD != -1 to use that value. +MAX_FD="maximum" + +warn ( ) { + echo "$*" +} + +die ( ) { + echo + echo "$*" + echo + exit 1 +} + +# OS specific support (must be 'true' or 'false'). +cygwin=false +msys=false +darwin=false +case "`uname`" in + CYGWIN* ) + cygwin=true + ;; + Darwin* ) + darwin=true + ;; + MINGW* ) + msys=true + ;; +esac + +# For Cygwin, ensure paths are in UNIX format before anything is touched. +if $cygwin ; then + [ -n "$JAVA_HOME" ] && JAVA_HOME=`cygpath --unix "$JAVA_HOME"` +fi + +# Attempt to set APP_HOME +# Resolve links: $0 may be a link +PRG="$0" +# Need this for relative symlinks. +while [ -h "$PRG" ] ; do + ls=`ls -ld "$PRG"` + link=`expr "$ls" : '.*-> \(.*\)$'` + if expr "$link" : '/.*' > /dev/null; then + PRG="$link" + else + PRG=`dirname "$PRG"`"/$link" + fi +done +SAVED="`pwd`" +cd "`dirname \"$PRG\"`/" >&- +APP_HOME="`pwd -P`" +cd "$SAVED" >&- + +CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar + +# Determine the Java command to use to start the JVM. +if [ -n "$JAVA_HOME" ] ; then + if [ -x "$JAVA_HOME/jre/sh/java" ] ; then + # IBM's JDK on AIX uses strange locations for the executables + JAVACMD="$JAVA_HOME/jre/sh/java" + else + JAVACMD="$JAVA_HOME/bin/java" + fi + if [ ! -x "$JAVACMD" ] ; then + die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." + fi +else + JAVACMD="java" + which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." +fi + +# Increase the maximum file descriptors if we can. +if [ "$cygwin" = "false" -a "$darwin" = "false" ] ; then + MAX_FD_LIMIT=`ulimit -H -n` + if [ $? -eq 0 ] ; then + if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then + MAX_FD="$MAX_FD_LIMIT" + fi + ulimit -n $MAX_FD + if [ $? -ne 0 ] ; then + warn "Could not set maximum file descriptor limit: $MAX_FD" + fi + else + warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT" + fi +fi + +# For Darwin, add options to specify how the application appears in the dock +if $darwin; then + GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\"" +fi + +# For Cygwin, switch paths to Windows format before running java +if $cygwin ; then + APP_HOME=`cygpath --path --mixed "$APP_HOME"` + CLASSPATH=`cygpath --path --mixed "$CLASSPATH"` + + # We build the pattern for arguments to be converted via cygpath + ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null` + SEP="" + for dir in $ROOTDIRSRAW ; do + ROOTDIRS="$ROOTDIRS$SEP$dir" + SEP="|" + done + OURCYGPATTERN="(^($ROOTDIRS))" + # Add a user-defined pattern to the cygpath arguments + if [ "$GRADLE_CYGPATTERN" != "" ] ; then + OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)" + fi + # Now convert the arguments - kludge to limit ourselves to /bin/sh + i=0 + for arg in "$@" ; do + CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -` + CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option + + if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition + eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"` + else + eval `echo args$i`="\"$arg\"" + fi + i=$((i+1)) + done + case $i in + (0) set -- ;; + (1) set -- "$args0" ;; + (2) set -- "$args0" "$args1" ;; + (3) set -- "$args0" "$args1" "$args2" ;; + (4) set -- "$args0" "$args1" "$args2" "$args3" ;; + (5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;; + (6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;; + (7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;; + (8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;; + (9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;; + esac +fi + +# Split up the JVM_OPTS And GRADLE_OPTS values into an array, following the shell quoting and substitution rules +function splitJvmOpts() { + JVM_OPTS=("$@") +} +eval splitJvmOpts $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS +JVM_OPTS[${#JVM_OPTS[*]}]="-Dorg.gradle.appname=$APP_BASE_NAME" + +exec "$JAVACMD" "${JVM_OPTS[@]}" -classpath "$CLASSPATH" org.gradle.wrapper.GradleWrapperMain "$@" diff --git a/android/gradlew.bat b/android/gradlew.bat new file mode 100644 index 0000000..aec9973 --- /dev/null +++ b/android/gradlew.bat @@ -0,0 +1,90 @@ +@if "%DEBUG%" == "" @echo off +@rem ########################################################################## +@rem +@rem Gradle startup script for Windows +@rem +@rem ########################################################################## + +@rem Set local scope for the variables with windows NT shell +if "%OS%"=="Windows_NT" setlocal + +@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 DIRNAME=%~dp0 +if "%DIRNAME%" == "" set DIRNAME=. +set APP_BASE_NAME=%~n0 +set APP_HOME=%DIRNAME% + +@rem Find java.exe +if defined JAVA_HOME goto findJavaFromJavaHome + +set JAVA_EXE=java.exe +%JAVA_EXE% -version >NUL 2>&1 +if "%ERRORLEVEL%" == "0" goto init + +echo. +echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:findJavaFromJavaHome +set JAVA_HOME=%JAVA_HOME:"=% +set JAVA_EXE=%JAVA_HOME%/bin/java.exe + +if exist "%JAVA_EXE%" goto init + +echo. +echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:init +@rem Get command-line arguments, handling Windowz variants + +if not "%OS%" == "Windows_NT" goto win9xME_args +if "%@eval[2+2]" == "4" goto 4NT_args + +:win9xME_args +@rem Slurp the command line arguments. +set CMD_LINE_ARGS= +set _SKIP=2 + +:win9xME_args_slurp +if "x%~1" == "x" goto execute + +set CMD_LINE_ARGS=%* +goto execute + +:4NT_args +@rem Get arguments from the 4NT Shell from JP Software +set CMD_LINE_ARGS=%$ + +:execute +@rem Setup the command line + +set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar + +@rem Execute Gradle +"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS% + +:end +@rem End local scope for the variables with windows NT shell +if "%ERRORLEVEL%"=="0" goto mainEnd + +:fail +rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of +rem the _cmd.exe /c_ return code! +if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 +exit /b 1 + +:mainEnd +if "%OS%"=="Windows_NT" endlocal + +:omega diff --git a/android/res/values/libs.xml b/android/res/values/libs.xml new file mode 100644 index 0000000..ee3f5e9 --- /dev/null +++ b/android/res/values/libs.xml @@ -0,0 +1,25 @@ + + + + https://download.qt.io/ministro/android/qt5/qt-5.6 + + + + + + + + + + + + + + + + + + + + diff --git a/docs/gost_android_take3.txt b/docs/gost_android_take3.txt new file mode 100644 index 0000000..3f831aa --- /dev/null +++ b/docs/gost_android_take3.txt @@ -0,0 +1,127 @@ +ARMV7 + +export NDK_PATH=/home/user/SDKS/ANDROID/NDK/android-ndk-r13b +export ANDROID_DEV=$NDK_PATH/platforms/android-9/arch-arm/usr +export AR=$NDK_PATH/toolchains/arm-linux-androideabi-4.9/prebuilt/linux-x86_64/bin/arm-linux-androideabi-ar +export AS=$NDK_PATH/toolchains/arm-linux-androideabi-4.9/prebuilt/linux-x86_64/bin/arm-linux-androideabi-as +export CC=$NDK_PATH/toolchains/arm-linux-androideabi-4.9/prebuilt/linux-x86_64/bin/arm-linux-androideabi-gcc +export CFLAGS=--sysroot=$NDK_PATH/platforms/android-9/arch-arm/ +export CPP=$NDK_PATH/toolchains/arm-linux-androideabi-4.9/prebuilt/linux-x86_64/bin/arm-linux-androideabi-cpp +export CPPFLAGS=--sysroot=$NDK_PATH/platforms/android-9/arch-arm/ +export CXX=$NDK_PATH/toolchains/arm-linux-androideabi-4.9/prebuilt/linux-x86_64/bin/arm-linux-androideabi-g++ +export CXXFLAGS="--sysroot=$NDK_PATH/platforms/android-9/arch-arm/ -I$NDK_PATH/sources/cxx-stl/gnu-libstdc++/4.9/include -I$NDK_PATH/sources/cxx-stl/gnu-libstdc++/4.9/libs/armeabi-v7a/include" +export LD=$NDK_PATH/toolchains/arm-linux-androideabi-4.9/prebuilt/linux-x86_64/bin/arm-linux-androideabi-ld +export NDK_PROJECT_PATH=$NDK_PATH +export RANLIB=$NDK_PATH/toolchains/arm-linux-androideabi-4.9/prebuilt/linux-x86_64/bin/arm-linux-androideabi-ranlib +export PATH=$NDK_PATH/toolchains/arm-linux-androideabi-4.9/prebuilt/linux-x86_64/bin/:$PATH + + +2. Построение зависимостей. +В инструкции все зависимости сохраняются в папку /path/to/libraries/take3/ + +2.1 OpenSSL +cd /path/to/libraries/take3 +wget -t0 https://www.openssl.org/source/openssl-1.0.2l.tar.gz +tar xzvf openssl-1.0.2l.tar.gz -C . +cd openssl-1.0.2l +./Configure no-shared no-dso android-armv7 +make + +2.2 Berkeley DB +cd /path/to/libraries/take3 +wget -t0 http://download.oracle.com/berkeley-db/db-6.0.20.tar.gz +tar xzvf db-6.0.20.tar.gz -C . +cd db-6.0.20/build_unix +../dist/configure --host=arm-linux-androideabi --enable-cxx --enable-shared --disable-replication +make + +2.3 Boost +-Скачайте http://sourceforge.net/projects/boost/files/boost/1.57.0/boost_1_57_0.7z/download +7z x ~/Downloads/boost_1_57_0.7z -o/path/to/libraries/take3/ +cd /path/to/libraries/take3/boost_1_57_0 +./bootstrap.sh + +edit boost_1_57_0\project-config.jam в текстовом редакторе, удалите его содержимое, вставьте следующий текст + +import option ; + +using gcc : arm : arm-linux-androideabi-g++ ; + +option.set keep-going : false ; + +и сохраните файл + +Вернитесь в командную строку и введите: + +./b2 --layout=versioned --build-type=complete --with-chrono --with-filesystem --with-program_options --with-system --with-thread toolset=gcc-arm variant=release link=static threading=multi threadapi=pthread target-os=android define=BOOST_MATH_DISABLE_FLOAT128 include=$NDK_PATH/sources/cxx-stl/gnu-libstdc++/4.9/include include=$NDK_PATH/sources/cxx-stl/gnu-libstdc++/4.9/libs/armeabi/include include=$NDK_PATH/platforms/android-9/arch-arm/usr/include + +После выполнения этой команды в папке /path/to/libraries/take3/boost_1_57_0/stage/lib должны появиться следующие файлы: +libboost_atomic-gcc-mt-s-1_57.a +libboost_chrono-gcc-mt-s-1_57.a +libboost_filesystem-gcc-mt-s-1_57.a +libboost_program_options-gcc-mt-s-1_57.a +libboost_system-gcc-mt-s-1_57.a +libboost_thread_pthread-gcc-mt-s-1_57.a + +2.4 LevelDB +cd git/gostcoin +cd src/leveldb +TARGET_OS=OS_ANDROID_CROSSCOMPILE make libleveldb.a libmemenv.a + +3. Компиляция +3.1 Собираем Qt.pro + +Откройте файл android/gostcoin-qt-android.pro + +Поправьте всё, соберите. + + + + + +Изменения для Android X86 +1. Добавить путь C:\Android\android-ndk-r10d\toolchains\x86-4.9\prebuilt\linux-x86_64\bin в переменную PATH +2. Изменить системные переменные так: + +ANDROID_DEV /c/Android/android-ndk-r10d/platforms/android-9/arch-x86/usr +AR /c/Android/android-ndk-r10d/toolchains/x86-4.9/prebuilt/linux-x86_64/bin/i686-linux-android-ar +AS /c/Android/android-ndk-r10d/toolchains/x86-4.9/prebuilt/linux-x86_64/bin/i686-linux-android-as +CC /c/Android/android-ndk-r10d/toolchains/x86-4.9/prebuilt/linux-x86_64/bin/i686-linux-android-gcc +CFLAGS --sysroot=/c/Android/android-ndk-r10d/platforms/android-9/arch-x86/ +CPP /c/Android/android-ndk-r10d/toolchains/x86-4.9/prebuilt/linux-x86_64/bin/i686-linux-android-cpp +CPPFLAGS --sysroot=/c/Android/android-ndk-r10d/platforms/android-9/arch-x86/ +CXX /c/Android/android-ndk-r10d/toolchains/x86-4.9/prebuilt/linux-x86_64/bin/i686-linux-android-g++ +CXXFLAGS --sysroot=/c/Android/android-ndk-r10d/platforms/android-9/arch-x86/ -I/c/Android/android-ndk-r10d/sources/cxx-stl/gnu-libstdc++/4.9/include -I/c/Android/android-ndk-r10d/sources/cxx-stl/gnu-libstdc++/4.9/libs/x86/include +LD /c/Android/android-ndk-r10d/toolchains/x86-4.9/prebuilt/linux-x86_64/bin/i686-linux-android-ld +NDK_PROJECT_PATH C:\Android\android-ndk-r10d +RANLIB /c/Android/android-ndk-r10d/toolchains/x86-4.9/prebuilt/linux-x86_64/bin/i686-linux-android-ranlib + +3. При построении OpenSSL выполнить +Configure no-shared no-dso android-x86 +вместо +Configure no-shared no-dso android-armv7 + +4. При построении BerkeleyDB выполнить +../dist/configure --host=x86-none-linux --enable-cxx --disable-shared --disable-replication +вместо +../dist/configure --host=arm-none-linux --enable-cxx --disable-shared --disable-replication + +5. При построении Boost вставить +using gcc : x86 : i686-linux-android-g++.exe ; +вместо +using gcc : arm : arm-linux-androideabi-g++.exe ; + +и выполнить +b2 --build-type=complete --with-chrono --with-filesystem --with-program_options --with-system --with-thread toolset=gcc variant=release link=static threading=multi threadapi=pthread target-os=android define=BOOST_MATH_DISABLE_FLOAT128 include=C:\Android\android-ndk-r10d\sources\cxx-stl\gnu-libstdc++\4.9\include include=C:\Android\android-ndk-r10d\sources\cxx-stl\gnu-libstdc++\4.9\libs\x86\include include=C:\Android\android-ndk-r10d\platforms\android-9\arch-x86\usr\include + +вместо + +b2 --build-type=complete --with-chrono --with-filesystem --with-program_options --with-system --with-thread toolset=gcc-arm variant=release link=static threading=multi threadapi=pthread target-os=android define=BOOST_MATH_DISABLE_FLOAT128 include=C:\Android\android-ndk-r10d\sources\cxx-stl\gnu-libstdc++\4.9\include include=C:\Android\android-ndk-r10d\sources\cxx-stl\gnu-libstdc++\4.9\libs\armeabi\include include=C:\Android\android-ndk-r10d\platforms\android-9\arch-arm\usr\include + +6. В QtCreator выбирать Android для X86 вместо Android для armeabi-v7a + + + + + +see also: https://github.com/novacoin-project/novacoin/blob/master/doc/building%20novacoin-qt%20for%20android%20under%20Windows.txt diff --git a/src/compat.h b/src/compat.h index 7062216..5e491bc 100644 --- a/src/compat.h +++ b/src/compat.h @@ -18,7 +18,11 @@ #else #include #include -#include +#ifndef ANDROID +# include +#else +# include +#endif #include #include #include diff --git a/src/netbase.cpp b/src/netbase.cpp index 9a8f4c7..efad191 100644 --- a/src/netbase.cpp +++ b/src/netbase.cpp @@ -10,7 +10,11 @@ #include "i2p.h" #ifndef WIN32 -#include +#ifndef ANDROID +# include +#else +# include +#endif #endif #include // for to_lower() diff --git a/src/qt/gostcoin.cpp b/src/qt/gostcoin.cpp index 041bd8e..2cf4c1d 100644 --- a/src/qt/gostcoin.cpp +++ b/src/qt/gostcoin.cpp @@ -11,6 +11,7 @@ #include #include #include +#include #include "bitcoingui.h" #include "clientmodel.h" @@ -25,6 +26,13 @@ #include "splashscreen.h" #include "setupdarknet.h" +#ifdef ANDROID + //for setenv("QT_USE_ANDROID_NATIVE_DIALOGS", GOSTCOIN_NO_NATIVE_ANDROID_DIALOGS, GOSTCOIN_SETENV_OVERWRITE); +# include +# define GOSTCOIN_NO_NATIVE_ANDROID_DIALOGS "0" +# define GOSTCOIN_SETENV_OVERWRITE 1 +#endif + #include #if QT_VERSION < 0x050000 #include @@ -171,6 +179,11 @@ int main(int argc, char *argv[]) Q_INIT_RESOURCE(bitcoin); QApplication app(argc, argv); +#ifdef ANDROID + //workaround for https://bugreports.qt.io/browse/QTBUG-35545 + setenv("QT_USE_ANDROID_NATIVE_DIALOGS", GOSTCOIN_NO_NATIVE_ANDROID_DIALOGS, GOSTCOIN_SETENV_OVERWRITE); +#endif + // Register meta types used for QMetaObject::invokeMethod qRegisterMetaType< bool* >(); @@ -377,6 +390,7 @@ int main(int argc, char *argv[]) return 1; } } catch (std::exception& e) { + qDebug() << "error:" << e.what(); handleRunawayException(&e); } catch (...) { handleRunawayException(NULL); diff --git a/src/util.cpp b/src/util.cpp index 9f9be48..1fdaa35 100644 --- a/src/util.cpp +++ b/src/util.cpp @@ -13,6 +13,12 @@ #include #endif +#if defined(ANDROID) +#include +#include +#include +#endif + #include "base58.h" #include "util.h" #include "sync.h" @@ -1073,6 +1079,30 @@ boost::filesystem::path GetDefaultDataDir() return GetSpecialFolderPath(CSIDL_APPDATA) / "Gostcoin"; #else fs::path pathRet; + +# if defined(ANDROID) + QAndroidJniObject mediaDir = QAndroidJniObject::callStaticObjectMethod("android/os/Environment", "getExternalStorageDirectory", "()Ljava/io/File;"); + QAndroidJniObject mediaPath = mediaDir.callObjectMethod( "getAbsolutePath", "()Ljava/lang/String;" ); + QString dataAbsPath = mediaPath.toString(); + QAndroidJniEnvironment env; + if (env->ExceptionCheck()) { + // Handle exception here. + env->ExceptionClear(); + } + std::string ext = dataAbsPath.toStdString(); + //if (!ext) ext = "/sdcard"; + if (boost::filesystem::exists(ext)) + { + fs::path canonical = fs::canonical(fs::path(std::string (ext))); + pathRet = fs::path(std::string(canonical.c_str()) + "/gostcoin"); + qDebug()<<"creating dir" << pathRet.c_str(); + boost::filesystem::path dir=pathRet; + boost::filesystem::create_directory(dir); + return pathRet; + } + // otherwise use /data/.../files +# endif + char* pszHome = getenv("HOME"); if (pszHome == NULL || strlen(pszHome) == 0) pathRet = fs::path("/"); @@ -1272,7 +1302,8 @@ void AllocateFileRange(FILE *file, unsigned int offset, unsigned int length) { fcntl(fileno(file), F_PREALLOCATE, &fst); } ftruncate(fileno(file), fst.fst_length); -#elif defined(__linux__) +#elif defined(__linux__) && !defined(ANDROID) + //android doesn't have posix_fallocate // Version using posix_fallocate off_t nEndPos = (off_t)offset + length; posix_fallocate(fileno(file), 0, nEndPos);