mirror of https://github.com/PurpleI2P/i2pd.git
hypnosis-i2p
9 years ago
17 changed files with 567 additions and 3 deletions
@ -0,0 +1,4 @@
@@ -0,0 +1,4 @@
|
||||
/gen/ |
||||
/libs/ |
||||
/tests/ |
||||
.idea |
@ -0,0 +1,16 @@
@@ -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> |
@ -0,0 +1,115 @@
@@ -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) |
@ -0,0 +1,30 @@
@@ -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 |
@ -0,0 +1,170 @@
@@ -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(); |
||||
} |
||||
} |
||||
} |
||||
|
@ -0,0 +1,86 @@
@@ -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
|
@ -0,0 +1,53 @@
@@ -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(); |
||||
} |
||||
|
@ -0,0 +1,21 @@
@@ -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 |
@ -0,0 +1,14 @@
@@ -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 |
After Width: | Height: | Size: 8.5 KiB |
After Width: | Height: | Size: 32 KiB |
@ -0,0 +1,4 @@
@@ -0,0 +1,4 @@
|
||||
<?xml version="1.0" encoding="utf-8"?> |
||||
<resources> |
||||
<string name="app_name">i2pd</string> |
||||
</resources> |
@ -0,0 +1,20 @@
@@ -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(); |
||||
} |
||||
} |
@ -0,0 +1,16 @@
@@ -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 new issue