diff --git a/stream/ch/chain/net/srv/vpn/DapStreamChChainNetSrvVpn.cpp b/stream/ch/chain/net/srv/vpn/DapStreamChChainNetSrvVpn.cpp
index 91a9acaf80713b3c39c59b0c10371ba80158833a..4f921d17bea5ead635249962d3517d5456f2dbc7 100644
--- a/stream/ch/chain/net/srv/vpn/DapStreamChChainNetSrvVpn.cpp
+++ b/stream/ch/chain/net/srv/vpn/DapStreamChChainNetSrvVpn.cpp
@@ -43,6 +43,12 @@ along with any CellFrame SDK based project.  If not, see <http://www.gnu.org/lic
 #include <winsock2.h>
 #endif
 
+#ifdef Q_OS_ANDROID
+#include <QtAndroid>
+#include <QAndroidJniEnvironment>
+#include <QAndroidJniObject>
+#endif
+
 #include <QProcess>
 #include <QFile>
 
@@ -291,28 +297,20 @@ void ChChainNetSrvVpn::tunCreate(const QString &a_addr, const QString &a_gw)
  */
 void ChChainNetSrvVpn::tunCreate()
 {
+    qDebug()<< "tunCreate()";
     tun->create(m_addr,
                 m_gw,
                 m_mainDapSession->upstreamAddress(),
                 m_mainDapSession->upstreamPort(),
                 streamer()->upstreamSocket());
 #ifdef ANDROID
-    if (m_fdListener == nullptr) {
-        m_fdListener = new QTcpServer();
-
-        connect(m_fdListener, &QTcpServer::newConnection, this, [&] {
-            qDebug() << "f0";
-            auto pending = m_fdListener->nextPendingConnection();
-            connect(pending, &QTcpSocket::readyRead, this, [=] {
-                if (pending) {
-                    int val = pending->readAll().toInt();
-                    workerStart(val);
-                    m_fdListener->close();
-                }
-            });
-        });
+    jint tunSocket = -1;
+    for (; tunSocket <= 0;) {
+        QThread::msleep(1000);
+        tunSocket = QtAndroid::androidService().callMethod<jint>("getTunSocket");
+        qInfo() << "Socket num: " << tunSocket;
     }
-    m_fdListener->listen(QHostAddress::LocalHost, 22500);
+    workerStart(tunSocket);
 #else
     tun->workerStart();
 #endif