mirror of
https://github.com/PurpleI2P/i2pd.git
synced 2025-01-22 21:37:17 +01:00
android without qt initial commit
This commit is contained in:
parent
40a4c3ccbd
commit
69c954760a
1
.gitignore
vendored
1
.gitignore
vendored
|
@ -237,3 +237,4 @@ pip-log.txt
|
||||||
|
|
||||||
# Sphinx
|
# Sphinx
|
||||||
docs/_build
|
docs/_build
|
||||||
|
/androidIdea/
|
||||||
|
|
14
Daemon.h
14
Daemon.h
|
@ -45,6 +45,20 @@ namespace i2p
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
#elif defined(ANDROID)
|
||||||
|
#define Daemon i2p::util::DaemonAndroid::Instance()
|
||||||
|
// dummy, invoked from android/jni/DaemonAndroid.*
|
||||||
|
class DaemonAndroid: public i2p::util::Daemon_Singleton
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
|
||||||
|
static DaemonAndroid& Instance()
|
||||||
|
{
|
||||||
|
static DaemonAndroid instance;
|
||||||
|
return instance;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
#elif defined(_WIN32)
|
#elif defined(_WIN32)
|
||||||
#define Daemon i2p::util::DaemonWin32::Instance()
|
#define Daemon i2p::util::DaemonWin32::Instance()
|
||||||
class DaemonWin32 : public Daemon_Singleton
|
class DaemonWin32 : public Daemon_Singleton
|
||||||
|
|
|
@ -377,7 +377,7 @@ namespace http {
|
||||||
s << " <a href=\"/?cmd=" << HTTP_COMMAND_STOP_ACCEPTING_TUNNELS << "\">Stop accepting tunnels</a><br>\r\n";
|
s << " <a href=\"/?cmd=" << HTTP_COMMAND_STOP_ACCEPTING_TUNNELS << "\">Stop accepting tunnels</a><br>\r\n";
|
||||||
else
|
else
|
||||||
s << " <a href=\"/?cmd=" << HTTP_COMMAND_START_ACCEPTING_TUNNELS << "\">Start accepting tunnels</a><br>\r\n";
|
s << " <a href=\"/?cmd=" << HTTP_COMMAND_START_ACCEPTING_TUNNELS << "\">Start accepting tunnels</a><br>\r\n";
|
||||||
#if (!defined(WIN32) && !defined(QT_GUI_LIB))
|
#if (!defined(WIN32) && !defined(QT_GUI_LIB) && !defined(ANDROID))
|
||||||
if (Daemon.gracefullShutdownInterval) {
|
if (Daemon.gracefullShutdownInterval) {
|
||||||
s << " <a href=\"/?cmd=" << HTTP_COMMAND_SHUTDOWN_CANCEL << "\">Cancel gracefull shutdown (";
|
s << " <a href=\"/?cmd=" << HTTP_COMMAND_SHUTDOWN_CANCEL << "\">Cancel gracefull shutdown (";
|
||||||
s << Daemon.gracefullShutdownInterval;
|
s << Daemon.gracefullShutdownInterval;
|
||||||
|
@ -690,12 +690,12 @@ namespace http {
|
||||||
i2p::context.SetAcceptsTunnels (false);
|
i2p::context.SetAcceptsTunnels (false);
|
||||||
else if (cmd == HTTP_COMMAND_SHUTDOWN_START) {
|
else if (cmd == HTTP_COMMAND_SHUTDOWN_START) {
|
||||||
i2p::context.SetAcceptsTunnels (false);
|
i2p::context.SetAcceptsTunnels (false);
|
||||||
#if (!defined(WIN32) && !defined(QT_GUI_LIB))
|
#if (!defined(WIN32) && !defined(QT_GUI_LIB) && !defined(ANDROID))
|
||||||
Daemon.gracefullShutdownInterval = 10*60;
|
Daemon.gracefullShutdownInterval = 10*60;
|
||||||
#endif
|
#endif
|
||||||
} else if (cmd == HTTP_COMMAND_SHUTDOWN_CANCEL) {
|
} else if (cmd == HTTP_COMMAND_SHUTDOWN_CANCEL) {
|
||||||
i2p::context.SetAcceptsTunnels (true);
|
i2p::context.SetAcceptsTunnels (true);
|
||||||
#if (!defined(WIN32) && !defined(QT_GUI_LIB))
|
#if (!defined(WIN32) && !defined(QT_GUI_LIB) && !defined(ANDROID))
|
||||||
Daemon.gracefullShutdownInterval = 0;
|
Daemon.gracefullShutdownInterval = 0;
|
||||||
#endif
|
#endif
|
||||||
} else if (cmd == HTTP_COMMAND_SHUTDOWN_NOW) {
|
} else if (cmd == HTTP_COMMAND_SHUTDOWN_NOW) {
|
||||||
|
|
4
android/.gitignore
vendored
Normal file
4
android/.gitignore
vendored
Normal file
|
@ -0,0 +1,4 @@
|
||||||
|
/gen/
|
||||||
|
/libs/
|
||||||
|
/tests/
|
||||||
|
.idea
|
16
android/AndroidManifest.xml
Executable file
16
android/AndroidManifest.xml
Executable file
|
@ -0,0 +1,16 @@
|
||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
package="org.purplei2p.i2pd"
|
||||||
|
android:versionCode="1"
|
||||||
|
android:versionName="1.0">
|
||||||
|
<uses-sdk android:minSdkVersion="9" />
|
||||||
|
<application android:label="@string/app_name" android:allowBackup="true" android:icon="@drawable/icon">
|
||||||
|
<activity android:name=".I2PD"
|
||||||
|
android:label="@string/app_name">
|
||||||
|
<intent-filter>
|
||||||
|
<action android:name="android.intent.action.MAIN" />
|
||||||
|
<category android:name="android.intent.category.LAUNCHER" />
|
||||||
|
</intent-filter>
|
||||||
|
</activity>
|
||||||
|
</application>
|
||||||
|
</manifest>
|
115
android/jni/Android.mk
Executable file
115
android/jni/Android.mk
Executable file
|
@ -0,0 +1,115 @@
|
||||||
|
LOCAL_PATH := $(call my-dir)
|
||||||
|
include $(CLEAR_VARS)
|
||||||
|
LOCAL_MODULE := i2pd
|
||||||
|
LOCAL_CPP_FEATURES := rtti exceptions
|
||||||
|
LOCAL_C_INCLUDES += $(IFADDRS_PATH) ../..
|
||||||
|
LOCAL_STATIC_LIBRARIES := \
|
||||||
|
boost_system-gcc-mt-1_53 \
|
||||||
|
boost_date_time-gcc-mt-1_53 \
|
||||||
|
boost_filesystem-gcc-mt-1_53 \
|
||||||
|
boost_program_options-gcc-mt-1_53 \
|
||||||
|
crypto ssl \
|
||||||
|
miniupnpc
|
||||||
|
LOCAL_LDLIBS := -lz
|
||||||
|
|
||||||
|
#LOCAL_CFLAGS :=
|
||||||
|
LOCAL_SRC_FILES := DaemonAndroid.cpp i2pd_android.cpp \
|
||||||
|
$(IFADDRS_PATH)/ifaddrs.c \
|
||||||
|
../../HTTPServer.cpp ../../I2PControl.cpp ../../Daemon.cpp ../../Config.cpp \
|
||||||
|
../../AddressBook.cpp \
|
||||||
|
../../api.cpp \
|
||||||
|
../../Base.cpp \
|
||||||
|
../../BOB.cpp \
|
||||||
|
../../ClientContext.cpp \
|
||||||
|
../../Crypto.cpp \
|
||||||
|
../../Datagram.cpp \
|
||||||
|
../../Destination.cpp \
|
||||||
|
../../Family.cpp \
|
||||||
|
../../FS.cpp \
|
||||||
|
../../Garlic.cpp \
|
||||||
|
../../Gzip.cpp \
|
||||||
|
../../HTTP.cpp \
|
||||||
|
../../HTTPProxy.cpp \
|
||||||
|
../../I2CP.cpp \
|
||||||
|
../../I2NPProtocol.cpp \
|
||||||
|
../../I2PEndian.cpp \
|
||||||
|
../../I2PService.cpp \
|
||||||
|
../../I2PTunnel.cpp \
|
||||||
|
../../Identity.cpp \
|
||||||
|
../../LeaseSet.cpp \
|
||||||
|
../../Log.cpp \
|
||||||
|
../../NetDb.cpp \
|
||||||
|
../../NetDbRequests.cpp \
|
||||||
|
../../NTCPSession.cpp \
|
||||||
|
../../Profiling.cpp \
|
||||||
|
../../Reseed.cpp \
|
||||||
|
../../RouterContext.cpp \
|
||||||
|
../../RouterInfo.cpp \
|
||||||
|
../../SAM.cpp \
|
||||||
|
../../Signature.cpp \
|
||||||
|
../../SOCKS.cpp \
|
||||||
|
../../SSU.cpp \
|
||||||
|
../../SSUData.cpp \
|
||||||
|
../../SSUSession.cpp \
|
||||||
|
../../Streaming.cpp \
|
||||||
|
../../TransitTunnel.cpp \
|
||||||
|
../../Transports.cpp \
|
||||||
|
../../Tunnel.cpp \
|
||||||
|
../../TunnelEndpoint.cpp \
|
||||||
|
../../TunnelGateway.cpp \
|
||||||
|
../../TunnelPool.cpp \
|
||||||
|
../../UPnP.cpp \
|
||||||
|
../../util.cpp \
|
||||||
|
../../i2pd.cpp
|
||||||
|
|
||||||
|
include $(BUILD_SHARED_LIBRARY)
|
||||||
|
|
||||||
|
LOCAL_PATH := $(call my-dir)
|
||||||
|
include $(CLEAR_VARS)
|
||||||
|
LOCAL_MODULE := boost_system-gcc-mt-1_53
|
||||||
|
LOCAL_SRC_FILES := $(BOOST_PATH)/boost_1_53_0/$(TARGET_ARCH_ABI)/lib/libboost_system-gcc-mt-1_53.a
|
||||||
|
LOCAL_EXPORT_C_INCLUDES := $(BOOST_PATH)/boost_1_53_0/include
|
||||||
|
include $(PREBUILT_STATIC_LIBRARY)
|
||||||
|
|
||||||
|
LOCAL_PATH := $(call my-dir)
|
||||||
|
include $(CLEAR_VARS)
|
||||||
|
LOCAL_MODULE := boost_date_time-gcc-mt-1_53
|
||||||
|
LOCAL_SRC_FILES := $(BOOST_PATH)/boost_1_53_0/$(TARGET_ARCH_ABI)/lib/libboost_date_time-gcc-mt-1_53.a
|
||||||
|
LOCAL_EXPORT_C_INCLUDES := $(BOOST_PATH)/boost_1_53_0/include
|
||||||
|
include $(PREBUILT_STATIC_LIBRARY)
|
||||||
|
|
||||||
|
LOCAL_PATH := $(call my-dir)
|
||||||
|
include $(CLEAR_VARS)
|
||||||
|
LOCAL_MODULE := boost_filesystem-gcc-mt-1_53
|
||||||
|
LOCAL_SRC_FILES := $(BOOST_PATH)/boost_1_53_0/$(TARGET_ARCH_ABI)/lib/libboost_filesystem-gcc-mt-1_53.a
|
||||||
|
LOCAL_EXPORT_C_INCLUDES := $(BOOST_PATH)/boost_1_53_0/include
|
||||||
|
include $(PREBUILT_STATIC_LIBRARY)
|
||||||
|
|
||||||
|
LOCAL_PATH := $(call my-dir)
|
||||||
|
include $(CLEAR_VARS)
|
||||||
|
LOCAL_MODULE := boost_program_options-gcc-mt-1_53
|
||||||
|
LOCAL_SRC_FILES := $(BOOST_PATH)/boost_1_53_0/$(TARGET_ARCH_ABI)/lib/libboost_program_options-gcc-mt-1_53.a
|
||||||
|
LOCAL_EXPORT_C_INCLUDES := $(BOOST_PATH)/boost_1_53_0/include
|
||||||
|
include $(PREBUILT_STATIC_LIBRARY)
|
||||||
|
|
||||||
|
LOCAL_PATH := $(call my-dir)
|
||||||
|
include $(CLEAR_VARS)
|
||||||
|
LOCAL_MODULE := crypto
|
||||||
|
LOCAL_SRC_FILES := $(OPENSSL_PATH)/openssl-1.0.2/$(TARGET_ARCH_ABI)/lib/libcrypto.a
|
||||||
|
LOCAL_EXPORT_C_INCLUDES := $(OPENSSL_PATH)/openssl-1.0.2/include
|
||||||
|
include $(PREBUILT_STATIC_LIBRARY)
|
||||||
|
|
||||||
|
LOCAL_PATH := $(call my-dir)
|
||||||
|
include $(CLEAR_VARS)
|
||||||
|
LOCAL_MODULE := ssl
|
||||||
|
LOCAL_SRC_FILES := $(OPENSSL_PATH)/openssl-1.0.2/$(TARGET_ARCH_ABI)/lib/libssl.a
|
||||||
|
LOCAL_EXPORT_C_INCLUDES := $(OPENSSL_PATH)/openssl-1.0.2/include
|
||||||
|
LOCAL_STATIC_LIBRARIES := crypto
|
||||||
|
include $(PREBUILT_STATIC_LIBRARY)
|
||||||
|
|
||||||
|
LOCAL_PATH := $(call my-dir)
|
||||||
|
include $(CLEAR_VARS)
|
||||||
|
LOCAL_MODULE := miniupnpc
|
||||||
|
LOCAL_SRC_FILES := $(MINIUPNP_PATH)/miniupnp-2.0/$(TARGET_ARCH_ABI)/lib/libminiupnpc.a
|
||||||
|
LOCAL_EXPORT_C_INCLUDES := $(MINIUPNP_PATH)/miniupnp-2.0/include
|
||||||
|
include $(PREBUILT_STATIC_LIBRARY)
|
30
android/jni/Application.mk
Executable file
30
android/jni/Application.mk
Executable file
|
@ -0,0 +1,30 @@
|
||||||
|
#APP_ABI := all
|
||||||
|
APP_ABI := armeabi-v7a x86
|
||||||
|
#can be android-3 but will fail for x86 since arch-x86 is not present at ndkroot/platforms/android-3/ . libz is taken from there.
|
||||||
|
APP_PLATFORM := android-9
|
||||||
|
|
||||||
|
# http://stackoverflow.com/a/21386866/529442 http://stackoverflow.com/a/15616255/529442 to enable c++11 support in Eclipse
|
||||||
|
NDK_TOOLCHAIN_VERSION := 4.9
|
||||||
|
# APP_STL := stlport_shared --> does not seem to contain C++11 features
|
||||||
|
APP_STL := gnustl_shared
|
||||||
|
|
||||||
|
# Enable c++11 extentions in source code
|
||||||
|
APP_CPPFLAGS += -std=c++11
|
||||||
|
|
||||||
|
APP_CPPFLAGS += -DUSE_UPNP -DANDROID -D__ANDROID__
|
||||||
|
ifeq ($(TARGET_ARCH_ABI),armeabi-v7a)
|
||||||
|
APP_CPPFLAGS += -DANDROID_ARM7A
|
||||||
|
endif
|
||||||
|
|
||||||
|
APP_OPTIM := debug
|
||||||
|
|
||||||
|
# git clone https://github.com/PurpleI2P/Boost-for-Android-Prebuilt.git
|
||||||
|
# git clone https://github.com/PurpleI2P/OpenSSL-for-Android-Prebuilt.git
|
||||||
|
# git clone https://github.com/PurpleI2P/MiniUPnP-for-Android-Prebuilt.git
|
||||||
|
# git clone https://github.com/PurpleI2P/android-ifaddrs.git
|
||||||
|
# change to your own
|
||||||
|
I2PD_LIBS_PATH=/path/to/libraries
|
||||||
|
BOOST_PATH = $(I2PD_LIBS_PATH)/Boost-for-Android-Prebuilt
|
||||||
|
OPENSSL_PATH = $(I2PD_LIBS_PATH)/OpenSSL-for-Android-Prebuilt
|
||||||
|
MINIUPNP_PATH = $(I2PD_LIBS_PATH)/MiniUPnP-for-Android-Prebuilt
|
||||||
|
IFADDRS_PATH = $(I2PD_LIBS_PATH)/android-ifaddrs
|
170
android/jni/DaemonAndroid.cpp
Normal file
170
android/jni/DaemonAndroid.cpp
Normal file
|
@ -0,0 +1,170 @@
|
||||||
|
#include "DaemonAndroid.h"
|
||||||
|
#include "../../Daemon.h"
|
||||||
|
//#include "mainwindow.h"
|
||||||
|
|
||||||
|
namespace i2p
|
||||||
|
{
|
||||||
|
namespace android
|
||||||
|
{
|
||||||
|
/* Worker::Worker (DaemonAndroidImpl& daemon):
|
||||||
|
m_Daemon (daemon)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
void Worker::startDaemon()
|
||||||
|
{
|
||||||
|
Log.d(TAG"Performing daemon start...");
|
||||||
|
m_Daemon.start();
|
||||||
|
Log.d(TAG"Daemon started.");
|
||||||
|
emit resultReady();
|
||||||
|
}
|
||||||
|
void Worker::restartDaemon()
|
||||||
|
{
|
||||||
|
Log.d(TAG"Performing daemon restart...");
|
||||||
|
m_Daemon.restart();
|
||||||
|
Log.d(TAG"Daemon restarted.");
|
||||||
|
emit resultReady();
|
||||||
|
}
|
||||||
|
void Worker::stopDaemon() {
|
||||||
|
Log.d(TAG"Performing daemon stop...");
|
||||||
|
m_Daemon.stop();
|
||||||
|
Log.d(TAG"Daemon stopped.");
|
||||||
|
emit resultReady();
|
||||||
|
}
|
||||||
|
|
||||||
|
Controller::Controller(DaemonAndroidImpl& daemon):
|
||||||
|
m_Daemon (daemon)
|
||||||
|
{
|
||||||
|
Worker *worker = new Worker (m_Daemon);
|
||||||
|
worker->moveToThread(&workerThread);
|
||||||
|
connect(&workerThread, &QThread::finished, worker, &QObject::deleteLater);
|
||||||
|
connect(this, &Controller::startDaemon, worker, &Worker::startDaemon);
|
||||||
|
connect(this, &Controller::stopDaemon, worker, &Worker::stopDaemon);
|
||||||
|
connect(this, &Controller::restartDaemon, worker, &Worker::restartDaemon);
|
||||||
|
connect(worker, &Worker::resultReady, this, &Controller::handleResults);
|
||||||
|
workerThread.start();
|
||||||
|
}
|
||||||
|
Controller::~Controller()
|
||||||
|
{
|
||||||
|
Log.d(TAG"Closing and waiting for daemon worker thread...");
|
||||||
|
workerThread.quit();
|
||||||
|
workerThread.wait();
|
||||||
|
Log.d(TAG"Waiting for daemon worker thread finished.");
|
||||||
|
if(m_Daemon.isRunning())
|
||||||
|
{
|
||||||
|
Log.d(TAG"Stopping the daemon...");
|
||||||
|
m_Daemon.stop();
|
||||||
|
Log.d(TAG"Stopped the daemon.");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
*/
|
||||||
|
DaemonAndroidImpl::DaemonAndroidImpl ():
|
||||||
|
/*mutex(nullptr), */
|
||||||
|
m_IsRunning(false),
|
||||||
|
m_RunningChangedCallback(nullptr)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
DaemonAndroidImpl::~DaemonAndroidImpl ()
|
||||||
|
{
|
||||||
|
//delete mutex;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool DaemonAndroidImpl::init(int argc, char* argv[])
|
||||||
|
{
|
||||||
|
//mutex=new QMutex(QMutex::Recursive);
|
||||||
|
setRunningCallback(0);
|
||||||
|
m_IsRunning=false;
|
||||||
|
return Daemon.init(argc,argv);
|
||||||
|
}
|
||||||
|
|
||||||
|
void DaemonAndroidImpl::start()
|
||||||
|
{
|
||||||
|
//QMutexLocker locker(mutex);
|
||||||
|
setRunning(true);
|
||||||
|
Daemon.start();
|
||||||
|
}
|
||||||
|
|
||||||
|
void DaemonAndroidImpl::stop()
|
||||||
|
{
|
||||||
|
//QMutexLocker locker(mutex);
|
||||||
|
Daemon.stop();
|
||||||
|
setRunning(false);
|
||||||
|
}
|
||||||
|
|
||||||
|
void DaemonAndroidImpl::restart()
|
||||||
|
{
|
||||||
|
//QMutexLocker locker(mutex);
|
||||||
|
stop();
|
||||||
|
start();
|
||||||
|
}
|
||||||
|
|
||||||
|
void DaemonAndroidImpl::setRunningCallback(runningChangedCallback cb)
|
||||||
|
{
|
||||||
|
m_RunningChangedCallback = cb;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool DaemonAndroidImpl::isRunning()
|
||||||
|
{
|
||||||
|
return m_IsRunning;
|
||||||
|
}
|
||||||
|
|
||||||
|
void DaemonAndroidImpl::setRunning(bool newValue)
|
||||||
|
{
|
||||||
|
bool oldValue = m_IsRunning;
|
||||||
|
if(oldValue!=newValue)
|
||||||
|
{
|
||||||
|
m_IsRunning = newValue;
|
||||||
|
if(m_RunningChangedCallback)
|
||||||
|
m_RunningChangedCallback();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static DaemonAndroidImpl daemon;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* returns 1 if daemon init failed
|
||||||
|
* returns 0 if daemon initialized and started okay
|
||||||
|
*/
|
||||||
|
int start(/*int argc, char* argv[]*/)
|
||||||
|
{
|
||||||
|
int result;
|
||||||
|
|
||||||
|
{
|
||||||
|
//Log.d(TAG"Initialising the daemon...");
|
||||||
|
bool daemonInitSuccess = daemon.init(0,0/*argc, argv*/);
|
||||||
|
if(!daemonInitSuccess)
|
||||||
|
{
|
||||||
|
//QMessageBox::critical(0, "Error", "Daemon init failed");
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
//Log.d(TAG"Initialised, creating the main window...");
|
||||||
|
//MainWindow w;
|
||||||
|
//Log.d(TAG"Before main window.show()...");
|
||||||
|
//w.show ();
|
||||||
|
|
||||||
|
{
|
||||||
|
//i2p::qt::Controller daemonQtController(daemon);
|
||||||
|
//Log.d(TAG"Starting the daemon...");
|
||||||
|
//emit daemonQtController.startDaemon();
|
||||||
|
//daemon.start ();
|
||||||
|
//Log.d(TAG"Starting GUI event loop...");
|
||||||
|
//result = app.exec();
|
||||||
|
//daemon.stop ();
|
||||||
|
daemon.start();
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//QMessageBox::information(&w, "Debug", "demon stopped");
|
||||||
|
//Log.d(TAG"Exiting the application");
|
||||||
|
//return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
void stop()
|
||||||
|
{
|
||||||
|
daemon.stop();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
86
android/jni/DaemonAndroid.h
Normal file
86
android/jni/DaemonAndroid.h
Normal file
|
@ -0,0 +1,86 @@
|
||||||
|
#ifndef DAEMON_ANDROID_H
|
||||||
|
#define DAEMON_ANDROID_H
|
||||||
|
|
||||||
|
namespace i2p
|
||||||
|
{
|
||||||
|
namespace android
|
||||||
|
{
|
||||||
|
//FIXME currently NOT threadsafe
|
||||||
|
class DaemonAndroidImpl
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
|
||||||
|
DaemonAndroidImpl ();
|
||||||
|
~DaemonAndroidImpl ();
|
||||||
|
|
||||||
|
typedef void (*runningChangedCallback)();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return success
|
||||||
|
*/
|
||||||
|
bool init(int argc, char* argv[]);
|
||||||
|
void start();
|
||||||
|
void stop();
|
||||||
|
void restart();
|
||||||
|
void setRunningCallback(runningChangedCallback cb);
|
||||||
|
bool isRunning();
|
||||||
|
private:
|
||||||
|
void setRunning(bool running);
|
||||||
|
private:
|
||||||
|
//QMutex* mutex;
|
||||||
|
bool m_IsRunning;
|
||||||
|
runningChangedCallback m_RunningChangedCallback;
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* returns 1 if daemon init failed
|
||||||
|
* returns 0 if daemon initialized and started okay
|
||||||
|
*/
|
||||||
|
int start();
|
||||||
|
|
||||||
|
// stops the daemon
|
||||||
|
void stop();
|
||||||
|
|
||||||
|
/*
|
||||||
|
class Worker : public QObject
|
||||||
|
{
|
||||||
|
Q_OBJECT
|
||||||
|
public:
|
||||||
|
|
||||||
|
Worker (DaemonAndroidImpl& daemon);
|
||||||
|
|
||||||
|
private:
|
||||||
|
|
||||||
|
DaemonAndroidImpl& m_Daemon;
|
||||||
|
|
||||||
|
public slots:
|
||||||
|
void startDaemon();
|
||||||
|
void restartDaemon();
|
||||||
|
void stopDaemon();
|
||||||
|
|
||||||
|
signals:
|
||||||
|
void resultReady();
|
||||||
|
};
|
||||||
|
|
||||||
|
class Controller : public QObject
|
||||||
|
{
|
||||||
|
Q_OBJECT
|
||||||
|
QThread workerThread;
|
||||||
|
public:
|
||||||
|
Controller(DaemonAndroidImpl& daemon);
|
||||||
|
~Controller();
|
||||||
|
private:
|
||||||
|
DaemonAndroidImpl& m_Daemon;
|
||||||
|
|
||||||
|
public slots:
|
||||||
|
void handleResults(){}
|
||||||
|
signals:
|
||||||
|
void startDaemon();
|
||||||
|
void stopDaemon();
|
||||||
|
void restartDaemon();
|
||||||
|
};
|
||||||
|
*/
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif // DAEMON_ANDROID_H
|
53
android/jni/i2pd_android.cpp
Executable file
53
android/jni/i2pd_android.cpp
Executable file
|
@ -0,0 +1,53 @@
|
||||||
|
|
||||||
|
//#include <string.h>
|
||||||
|
#include <jni.h>
|
||||||
|
#include "org_purplei2p_i2pd_I2PD_JNI.h"
|
||||||
|
#include "DaemonAndroid.h"
|
||||||
|
|
||||||
|
JNIEXPORT jstring JNICALL Java_org_purplei2p_i2pd_I2PD_1JNI_getABICompiledWith
|
||||||
|
(JNIEnv * env, jclass clazz) {
|
||||||
|
#if defined(__arm__)
|
||||||
|
#if defined(__ARM_ARCH_7A__)
|
||||||
|
#if defined(__ARM_NEON__)
|
||||||
|
#if defined(__ARM_PCS_VFP)
|
||||||
|
#define ABI "armeabi-v7a/NEON (hard-float)"
|
||||||
|
#else
|
||||||
|
#define ABI "armeabi-v7a/NEON"
|
||||||
|
#endif
|
||||||
|
#else
|
||||||
|
#if defined(__ARM_PCS_VFP)
|
||||||
|
#define ABI "armeabi-v7a (hard-float)"
|
||||||
|
#else
|
||||||
|
#define ABI "armeabi-v7a"
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
#else
|
||||||
|
#define ABI "armeabi"
|
||||||
|
#endif
|
||||||
|
#elif defined(__i386__)
|
||||||
|
#define ABI "x86"
|
||||||
|
#elif defined(__x86_64__)
|
||||||
|
#define ABI "x86_64"
|
||||||
|
#elif defined(__mips64) /* mips64el-* toolchain defines __mips__ too */
|
||||||
|
#define ABI "mips64"
|
||||||
|
#elif defined(__mips__)
|
||||||
|
#define ABI "mips"
|
||||||
|
#elif defined(__aarch64__)
|
||||||
|
#define ABI "arm64-v8a"
|
||||||
|
#else
|
||||||
|
#define ABI "unknown"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
return env->NewStringUTF(ABI);
|
||||||
|
}
|
||||||
|
|
||||||
|
JNIEXPORT jint JNICALL Java_org_purplei2p_i2pd_I2PD_1JNI_startDaemon
|
||||||
|
(JNIEnv * env, jclass clazz) {
|
||||||
|
return (jint)i2p::android::start();
|
||||||
|
}
|
||||||
|
|
||||||
|
JNIEXPORT void JNICALL Java_org_purplei2p_i2pd_I2PD_1JNI_stopDaemon
|
||||||
|
(JNIEnv * env, jclass clazz) {
|
||||||
|
i2p::android::stop();
|
||||||
|
}
|
||||||
|
|
21
android/jni/org_purplei2p_i2pd_I2PD_JNI.h
Normal file
21
android/jni/org_purplei2p_i2pd_I2PD_JNI.h
Normal file
|
@ -0,0 +1,21 @@
|
||||||
|
/* DO NOT EDIT THIS FILE - it is machine generated */
|
||||||
|
#include <jni.h>
|
||||||
|
/* Header for class org_purplei2p_i2pd_I2PD_JNI */
|
||||||
|
|
||||||
|
#ifndef _Included_org_purplei2p_i2pd_I2PD_JNI
|
||||||
|
#define _Included_org_purplei2p_i2pd_I2PD_JNI
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
/*
|
||||||
|
* Class: org_purplei2p_i2pd_I2PD_JNI
|
||||||
|
* Method: stringFromJNI
|
||||||
|
* Signature: ()Ljava/lang/String;
|
||||||
|
*/
|
||||||
|
JNIEXPORT jstring JNICALL Java_org_purplei2p_i2pd_I2PD_1JNI_getABICompiledWith
|
||||||
|
(JNIEnv *, jclass);
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
#endif
|
14
android/project.properties
Normal file
14
android/project.properties
Normal file
|
@ -0,0 +1,14 @@
|
||||||
|
# This file is automatically generated by Android Tools.
|
||||||
|
# Do not modify this file -- YOUR CHANGES WILL BE ERASED!
|
||||||
|
#
|
||||||
|
# This file must be checked in Version Control Systems.
|
||||||
|
#
|
||||||
|
# To customize properties used by the Ant build system edit
|
||||||
|
# "ant.properties", and override values to adapt the script to your
|
||||||
|
# project structure.
|
||||||
|
#
|
||||||
|
# To enable ProGuard to shrink and obfuscate your code, uncomment this (available properties: sdk.dir, user.home):
|
||||||
|
#proguard.config=${sdk.dir}/tools/proguard/proguard-android.txt:proguard-project.txt
|
||||||
|
|
||||||
|
# Project target.
|
||||||
|
target=android-9
|
BIN
android/res/drawable/icon.png
Normal file
BIN
android/res/drawable/icon.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 8.5 KiB |
BIN
android/res/drawable/itoopie_notification_icon.png
Normal file
BIN
android/res/drawable/itoopie_notification_icon.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 32 KiB |
4
android/res/values/strings.xml
Executable file
4
android/res/values/strings.xml
Executable file
|
@ -0,0 +1,4 @@
|
||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<resources>
|
||||||
|
<string name="app_name">i2pd</string>
|
||||||
|
</resources>
|
20
android/src/org/purplei2p/i2pd/I2PD.java
Executable file
20
android/src/org/purplei2p/i2pd/I2PD.java
Executable file
|
@ -0,0 +1,20 @@
|
||||||
|
package org.purplei2p.i2pd;
|
||||||
|
|
||||||
|
import android.app.Activity;
|
||||||
|
import android.widget.TextView;
|
||||||
|
import android.os.Bundle;
|
||||||
|
|
||||||
|
public class I2PD extends Activity {
|
||||||
|
@Override
|
||||||
|
public void onCreate(Bundle savedInstanceState) {
|
||||||
|
super.onCreate(savedInstanceState);
|
||||||
|
|
||||||
|
TextView tv = new TextView(this);
|
||||||
|
tv.setText( "libi2pd.so was compiled with ABI " + getABICompiledWith());
|
||||||
|
setContentView(tv);
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getABICompiledWith() {
|
||||||
|
return I2PD_JNI.getABICompiledWith();
|
||||||
|
}
|
||||||
|
}
|
16
android/src/org/purplei2p/i2pd/I2PD_JNI.java
Normal file
16
android/src/org/purplei2p/i2pd/I2PD_JNI.java
Normal file
|
@ -0,0 +1,16 @@
|
||||||
|
package org.purplei2p.i2pd;
|
||||||
|
|
||||||
|
public class I2PD_JNI {
|
||||||
|
public static native String getABICompiledWith();
|
||||||
|
/**
|
||||||
|
* returns 1 if daemon init failed
|
||||||
|
* returns 0 if daemon initialized and started okay
|
||||||
|
*/
|
||||||
|
public static native int startDaemon();
|
||||||
|
//should only be called after startDaemon() success
|
||||||
|
public static native void stopDaemon();
|
||||||
|
|
||||||
|
static {
|
||||||
|
System.loadLibrary("i2pd");
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in a new issue