diff --git a/src/plugins/android/src/common/qandroidvideorendercontrol.cpp b/src/plugins/android/src/common/qandroidvideorendercontrol.cpp
index c5d38aebe66fcbd4a776ccbb53ea7ae87849fd7c..0eb8d172ff16da8e48ce788a5344c089ad6aa65a 100644
--- a/src/plugins/android/src/common/qandroidvideorendercontrol.cpp
+++ b/src/plugins/android/src/common/qandroidvideorendercontrol.cpp
@@ -41,7 +41,7 @@
 
 #include "qandroidvideorendercontrol.h"
 
-#include <QtPlatformSupport/private/qjnihelpers_p.h>
+#include <QtCore/private/qjni_p.h>
 #include "jsurfacetextureholder.h"
 #include <QAbstractVideoSurface>
 #include <QOpenGLContext>
@@ -268,7 +268,7 @@ jobject QAndroidVideoRendererControl::surfaceHolder()
         return 0;
 
     if (!m_surfaceHolder) {
-        m_androidSurface = new QJNIObject("android/view/Surface",
+        m_androidSurface = new QJNIObjectPrivate("android/view/Surface",
                                           "(Landroid/graphics/SurfaceTexture;)V",
                                           m_surfaceTexture->object());
 
diff --git a/src/plugins/android/src/common/qandroidvideorendercontrol.h b/src/plugins/android/src/common/qandroidvideorendercontrol.h
index d8078f075dc48879cf95c6343120fcb79b38d905..25220310e354ddd6b95ecc71ad251475f3a94b09 100644
--- a/src/plugins/android/src/common/qandroidvideorendercontrol.h
+++ b/src/plugins/android/src/common/qandroidvideorendercontrol.h
@@ -90,7 +90,7 @@ private:
     bool m_useImage;
     QSize m_nativeSize;
 
-    QJNIObject *m_androidSurface;
+    QJNIObjectPrivate *m_androidSurface;
     JSurfaceTexture *m_surfaceTexture;
     JSurfaceTextureHolder *m_surfaceHolder;
     uint m_externalTex;
diff --git a/src/plugins/android/src/mediacapture/qandroidcapturesession.cpp b/src/plugins/android/src/mediacapture/qandroidcapturesession.cpp
index 1927aeb8ea50911cc75beb88b2c916ee446f2fb4..ec458eddb70cfd380da9e05c0f6bb73e59a41cb4 100644
--- a/src/plugins/android/src/mediacapture/qandroidcapturesession.cpp
+++ b/src/plugins/android/src/mediacapture/qandroidcapturesession.cpp
@@ -45,7 +45,7 @@
 #include "qandroidcamerasession.h"
 #include "jmultimediautils.h"
 #include "qandroidmultimediautils.h"
-#include <QtPlatformSupport/private/qjnihelpers_p.h>
+#include <QtCore/private/qjni_p.h>
 
 QT_BEGIN_NAMESPACE
 
@@ -466,22 +466,20 @@ void QAndroidCaptureSession::onCameraOpened()
 QAndroidCaptureSession::CaptureProfile QAndroidCaptureSession::getProfile(int id)
 {
     CaptureProfile profile;
-    bool hasProfile = QJNIObject::callStaticMethod<jboolean>("android/media/CamcorderProfile",
+    bool hasProfile = QJNIObjectPrivate::callStaticMethod<jboolean>("android/media/CamcorderProfile",
                                                              "hasProfile",
                                                              "(II)Z",
                                                              m_cameraSession->camera()->cameraId(),
                                                              id);
 
     if (hasProfile) {
-        QJNILocalRef<jobject> ref = QJNIObject::callStaticObjectMethod<jobject>("android/media/CamcorderProfile",
-                                                                                "get",
-                                                                                "(II)Landroid/media/CamcorderProfile;",
-                                                                                m_cameraSession->camera()->cameraId(),
-                                                                                id);
+        QJNIObjectPrivate obj = QJNIObjectPrivate::callStaticObjectMethod("android/media/CamcorderProfile",
+                                                                          "get",
+                                                                          "(II)Landroid/media/CamcorderProfile;",
+                                                                          m_cameraSession->camera()->cameraId(),
+                                                                          id);
 
 
-        QJNIObject obj(ref.object());
-
         profile.outputFormat = JMediaRecorder::OutputFormat(obj.getField<jint>("fileFormat"));
         profile.audioEncoder = JMediaRecorder::AudioEncoder(obj.getField<jint>("audioCodec"));
         profile.audioBitRate = obj.getField<jint>("audioBitRate");
diff --git a/src/plugins/android/src/mediacapture/qandroidvideodeviceselectorcontrol.cpp b/src/plugins/android/src/mediacapture/qandroidvideodeviceselectorcontrol.cpp
index 26dce565eefc0d6611e1eaace7b3f87a280bdb6e..04af61085b8626444de44ac1fa7fd4d7c5c864d8 100644
--- a/src/plugins/android/src/mediacapture/qandroidvideodeviceselectorcontrol.cpp
+++ b/src/plugins/android/src/mediacapture/qandroidvideodeviceselectorcontrol.cpp
@@ -43,7 +43,6 @@
 
 #include "qandroidcamerasession.h"
 #include "jcamera.h"
-#include <QtPlatformSupport/private/qjnihelpers_p.h>
 
 QT_BEGIN_NAMESPACE
 
@@ -103,12 +102,12 @@ void QAndroidVideoDeviceSelectorControl::update()
     m_names.clear();
     m_descriptions.clear();
 
-    QJNIObject cameraInfo("android/hardware/Camera$CameraInfo");
-    int numCameras = QJNIObject::callStaticMethod<jint>("android/hardware/Camera",
+    QJNIObjectPrivate cameraInfo("android/hardware/Camera$CameraInfo");
+    int numCameras = QJNIObjectPrivate::callStaticMethod<jint>("android/hardware/Camera",
                                                         "getNumberOfCameras");
 
     for (int i = 0; i < numCameras; ++i) {
-        QJNIObject::callStaticMethod<void>("android/hardware/Camera",
+        QJNIObjectPrivate::callStaticMethod<void>("android/hardware/Camera",
                                            "getCameraInfo",
                                            "(ILandroid/hardware/Camera$CameraInfo;)V",
                                            i, cameraInfo.object());
diff --git a/src/plugins/android/src/src.pro b/src/plugins/android/src/src.pro
index e99fd30f55c59c85eb7dafa8c1ab49542ae051cd..d071f6fcd3ff31e2cd28ea19a623d4afc8914c22 100644
--- a/src/plugins/android/src/src.pro
+++ b/src/plugins/android/src/src.pro
@@ -1,5 +1,5 @@
 TARGET = qtmedia_android
-QT += multimedia-private gui-private platformsupport-private network
+QT += multimedia-private core-private network
 
 PLUGIN_TYPE = mediaservice
 PLUGIN_CLASS_NAME = QAndroidMediaServicePlugin
diff --git a/src/plugins/android/src/wrappers/jcamera.cpp b/src/plugins/android/src/wrappers/jcamera.cpp
index 9005ac6e02313b4f5786ac8e47acb0f9a587f276..f53fa4936a9858080c8322a44d484f558370c5b8 100644
--- a/src/plugins/android/src/wrappers/jcamera.cpp
+++ b/src/plugins/android/src/wrappers/jcamera.cpp
@@ -41,7 +41,7 @@
 
 #include "jcamera.h"
 
-#include <QtPlatformSupport/private/qjnihelpers_p.h>
+#include <QtCore/private/qjni_p.h>
 #include <qstringlist.h>
 #include <qdebug.h>
 #include "qandroidmultimediautils.h"
@@ -53,9 +53,8 @@ static QMap<int, JCamera*> g_objectMap;
 
 static QRect areaToRect(jobject areaObj)
 {
-    QJNIObject area(areaObj);
-    QJNILocalRef<jobject> rectRef = area.getObjectField<jobject>("rect", "android/graphics/Rect");
-    QJNIObject rect(rectRef.object());
+    QJNIObjectPrivate area(areaObj);
+    QJNIObjectPrivate rect = area.getObjectField("rect", "android/graphics/Rect");
 
     return QRect(rect.getField<jint>("left"),
                  rect.getField<jint>("top"),
@@ -63,17 +62,17 @@ static QRect areaToRect(jobject areaObj)
                  rect.callMethod<jint>("height"));
 }
 
-static QJNILocalRef<jobject> rectToArea(const QRect &rect)
+static QJNIObjectPrivate rectToArea(const QRect &rect)
 {
-    QJNIObject jrect("android/graphics/Rect",
+    QJNIObjectPrivate jrect("android/graphics/Rect",
                      "(IIII)V",
                      rect.left(), rect.top(), rect.right(), rect.bottom());
 
-    QJNIObject area("android/hardware/Camera$Area",
+    QJNIObjectPrivate area("android/hardware/Camera$Area",
                     "(Landroid/graphics/Rect;I)V",
                     jrect.object(), 500);
 
-    return QJNILocalRef<jobject>(QAttachedJNIEnv()->NewLocalRef(area.object()));
+    return area;
 }
 
 // native method for QtCamera.java
@@ -105,27 +104,25 @@ static void notifyPictureCaptured(JNIEnv *env, jobject, int id, jbyteArray data)
 
 JCamera::JCamera(int cameraId, jobject cam)
     : QObject()
-    , QJNIObject(cam)
+    , QJNIObjectPrivate(cam)
     , m_cameraId(cameraId)
-    , m_info(0)
-    , m_parameters(0)
     , m_hasAPI14(false)
 {
     if (isValid()) {
         g_objectMap.insert(cameraId, this);
 
-        m_info = new QJNIObject("android/hardware/Camera$CameraInfo");
+        m_info = QJNIObjectPrivate("android/hardware/Camera$CameraInfo");
         callStaticMethod<void>("android/hardware/Camera",
                                "getCameraInfo",
                                "(ILandroid/hardware/Camera$CameraInfo;)V",
-                               cameraId, m_info->object());
+                               cameraId, m_info.object());
 
-        QJNILocalRef<jobject> params = callObjectMethod<jobject>("getParameters",
-                                                                 "()Landroid/hardware/Camera$Parameters;");
-        m_parameters = new QJNIObject(params.object());
+        QJNIObjectPrivate params = callObjectMethod("getParameters",
+                                                    "()Landroid/hardware/Camera$Parameters;");
+        m_parameters = QJNIObjectPrivate(params);
 
         // Check if API 14 is available
-        QAttachedJNIEnv env;
+        QJNIEnvironmentPrivate env;
         jclass clazz = env->FindClass("android/hardware/Camera");
         if (env->ExceptionCheck()) {
             clazz = 0;
@@ -147,20 +144,18 @@ JCamera::~JCamera()
 {
     if (isValid())
         g_objectMap.remove(m_cameraId);
-    delete m_parameters;
-    delete m_info;
 }
 
 JCamera *JCamera::open(int cameraId)
 {
-    QAttachedJNIEnv env;
+    QJNIEnvironmentPrivate env;
 
-    QJNILocalRef<jobject> camera = callStaticObjectMethod<jobject>(g_qtCameraClass,
-                                                                   "open",
-                                                                   "(I)Lorg/qtproject/qt5/android/multimedia/QtCamera;",
-                                                                   cameraId);
+    QJNIObjectPrivate camera = callStaticObjectMethod(g_qtCameraClass,
+                                                      "open",
+                                                      "(I)Lorg/qtproject/qt5/android/multimedia/QtCamera;",
+                                                      cameraId);
 
-    if (camera.isNull())
+    if (!camera.isValid())
         return 0;
     else
         return new JCamera(cameraId, camera.object());
@@ -184,30 +179,28 @@ void JCamera::reconnect()
 void JCamera::release()
 {
     m_previewSize = QSize();
-    delete m_parameters;
-    m_parameters = 0;
+    m_parameters = QJNIObjectPrivate();
     callMethod<void>("release");
 }
 
 JCamera::CameraFacing JCamera::getFacing()
 {
-    return CameraFacing(m_info->getField<jint>("facing"));
+    return CameraFacing(m_info.getField<jint>("facing"));
 }
 
 int JCamera::getNativeOrientation()
 {
-    return m_info->getField<jint>("orientation");
+    return m_info.getField<jint>("orientation");
 }
 
 QSize JCamera::getPreferredPreviewSizeForVideo()
 {
-    if (!m_parameters || !m_parameters->isValid())
+    if (!m_parameters.isValid())
         return QSize();
 
-    QJNILocalRef<jobject> sizeRef = m_parameters->callObjectMethod<jobject>("getPreferredPreviewSizeForVideo",
-                                                                            "()Landroid/hardware/Camera$Size;");
+    QJNIObjectPrivate size = m_parameters.callObjectMethod("getPreferredPreviewSizeForVideo",
+                                                           "()Landroid/hardware/Camera$Size;");
 
-    QJNIObject size(sizeRef.object());
     return QSize(size.getField<jint>("width"), size.getField<jint>("height"));
 }
 
@@ -215,16 +208,14 @@ QList<QSize> JCamera::getSupportedPreviewSizes()
 {
     QList<QSize> list;
 
-    if (m_parameters && m_parameters->isValid()) {
-        QJNILocalRef<jobject> sizeListRef = m_parameters->callObjectMethod<jobject>("getSupportedPreviewSizes",
-                                                                                    "()Ljava/util/List;");
-        QJNIObject sizeList(sizeListRef.object());
+    if (m_parameters.isValid()) {
+        QJNIObjectPrivate sizeList = m_parameters.callObjectMethod("getSupportedPreviewSizes",
+                                                                   "()Ljava/util/List;");
         int count = sizeList.callMethod<jint>("size");
         for (int i = 0; i < count; ++i) {
-            QJNILocalRef<jobject> sizeRef = sizeList.callObjectMethod<jobject>("get",
-                                                                               "(I)Ljava/lang/Object;",
-                                                                               i);
-            QJNIObject size(sizeRef.object());
+            QJNIObjectPrivate size = sizeList.callObjectMethod("get",
+                                                               "(I)Ljava/lang/Object;",
+                                                               i);
             list.append(QSize(size.getField<jint>("width"), size.getField<jint>("height")));
         }
 
@@ -236,12 +227,12 @@ QList<QSize> JCamera::getSupportedPreviewSizes()
 
 void JCamera::setPreviewSize(const QSize &size)
 {
-    if (!m_parameters || !m_parameters->isValid())
+    if (!m_parameters.isValid())
         return;
 
     m_previewSize = size;
 
-    m_parameters->callMethod<void>("setPreviewSize", "(II)V", size.width(), size.height());
+    m_parameters.callMethod<void>("setPreviewSize", "(II)V", size.width(), size.height());
     applyParameters();
 
     emit previewSizeChanged();
@@ -254,35 +245,33 @@ void JCamera::setPreviewTexture(jobject surfaceTexture)
 
 bool JCamera::isZoomSupported()
 {
-    if (!m_parameters || !m_parameters->isValid())
+    if (!m_parameters.isValid())
         return false;
 
-    return m_parameters->callMethod<jboolean>("isZoomSupported");
+    return m_parameters.callMethod<jboolean>("isZoomSupported");
 }
 
 int JCamera::getMaxZoom()
 {
-    if (!m_parameters || !m_parameters->isValid())
+    if (!m_parameters.isValid())
         return 0;
 
-    return m_parameters->callMethod<jint>("getMaxZoom");
+    return m_parameters.callMethod<jint>("getMaxZoom");
 }
 
 QList<int> JCamera::getZoomRatios()
 {
     QList<int> ratios;
 
-    if (m_parameters && m_parameters->isValid()) {
-        QJNILocalRef<jobject> ratioListRef = m_parameters->callObjectMethod<jobject>("getZoomRatios",
-                                                                                     "()Ljava/util/List;");
-        QJNIObject ratioList(ratioListRef.object());
+    if (m_parameters.isValid()) {
+        QJNIObjectPrivate ratioList = m_parameters.callObjectMethod("getZoomRatios",
+                                                                    "()Ljava/util/List;");
         int count = ratioList.callMethod<jint>("size");
         for (int i = 0; i < count; ++i) {
-            QJNILocalRef<jobject> zoomRatioRef = ratioList.callObjectMethod<jobject>("get",
-                                                                                     "(I)Ljava/lang/Object;",
-                                                                                     i);
+            QJNIObjectPrivate zoomRatio = ratioList.callObjectMethod("get",
+                                                                     "(I)Ljava/lang/Object;",
+                                                                     i);
 
-            QJNIObject zoomRatio(zoomRatioRef.object());
             ratios.append(zoomRatio.callMethod<jint>("intValue"));
         }
     }
@@ -292,18 +281,18 @@ QList<int> JCamera::getZoomRatios()
 
 int JCamera::getZoom()
 {
-    if (!m_parameters || !m_parameters->isValid())
+    if (!m_parameters.isValid())
         return 0;
 
-    return m_parameters->callMethod<jint>("getZoom");
+    return m_parameters.callMethod<jint>("getZoom");
 }
 
 void JCamera::setZoom(int value)
 {
-    if (!m_parameters || !m_parameters->isValid())
+    if (!m_parameters.isValid())
         return;
 
-    m_parameters->callMethod<void>("setZoom", "(I)V", value);
+    m_parameters.callMethod<void>("setZoom", "(I)V", value);
     applyParameters();
 }
 
@@ -316,11 +305,11 @@ QString JCamera::getFlashMode()
 {
     QString value;
 
-    if (m_parameters && m_parameters->isValid()) {
-        QJNILocalRef<jstring> flashMode = m_parameters->callObjectMethod<jstring>("getFlashMode",
-                                                                                  "()Ljava/lang/String;");
-        if (!flashMode.isNull())
-            value = qt_convertJString(flashMode.object());
+    if (m_parameters.isValid()) {
+        QJNIObjectPrivate flashMode = m_parameters.callObjectMethod("getFlashMode",
+                                                                    "()Ljava/lang/String;");
+        if (flashMode.isValid())
+            value = flashMode.toString();
     }
 
     return value;
@@ -328,12 +317,12 @@ QString JCamera::getFlashMode()
 
 void JCamera::setFlashMode(const QString &value)
 {
-    if (!m_parameters || !m_parameters->isValid())
+    if (!m_parameters.isValid())
         return;
 
-    m_parameters->callMethod<void>("setFlashMode",
-                                   "(Ljava/lang/String;)V",
-                                   qt_toJString(value).object());
+    m_parameters.callMethod<void>("setFlashMode",
+                                  "(Ljava/lang/String;)V",
+                                  QJNIObjectPrivate::fromString(value).object());
     applyParameters();
 }
 
@@ -346,11 +335,11 @@ QString JCamera::getFocusMode()
 {
     QString value;
 
-    if (m_parameters && m_parameters->isValid()) {
-        QJNILocalRef<jstring> focusMode = m_parameters->callObjectMethod<jstring>("getFocusMode",
-                                                                                  "()Ljava/lang/String;");
-        if (!focusMode.isNull())
-            value = qt_convertJString(focusMode.object());
+    if (m_parameters.isValid()) {
+        QJNIObjectPrivate focusMode = m_parameters.callObjectMethod("getFocusMode",
+                                                                    "()Ljava/lang/String;");
+        if (focusMode.isValid())
+            value = focusMode.toString();
     }
 
     return value;
@@ -358,40 +347,39 @@ QString JCamera::getFocusMode()
 
 void JCamera::setFocusMode(const QString &value)
 {
-    if (!m_parameters || !m_parameters->isValid())
+    if (!m_parameters.isValid())
         return;
 
-    m_parameters->callMethod<void>("setFocusMode",
-                                   "(Ljava/lang/String;)V",
-                                   qt_toJString(value).object());
+    m_parameters.callMethod<void>("setFocusMode",
+                                  "(Ljava/lang/String;)V",
+                                  QJNIObjectPrivate::fromString(value).object());
     applyParameters();
 }
 
 int JCamera::getMaxNumFocusAreas()
 {
-    if (!m_hasAPI14 || !m_parameters || !m_parameters->isValid())
+    if (!m_hasAPI14 || !m_parameters.isValid())
         return 0;
 
-    return m_parameters->callMethod<jint>("getMaxNumFocusAreas");
+    return m_parameters.callMethod<jint>("getMaxNumFocusAreas");
 }
 
 QList<QRect> JCamera::getFocusAreas()
 {
     QList<QRect> areas;
 
-    if (m_hasAPI14 && m_parameters && m_parameters->isValid()) {
-        QJNILocalRef<jobject> listRef = m_parameters->callObjectMethod<jobject>("getFocusAreas",
-                                                                                "()Ljava/util/List;");
+    if (m_hasAPI14 && m_parameters.isValid()) {
+        QJNIObjectPrivate list = m_parameters.callObjectMethod("getFocusAreas",
+                                                               "()Ljava/util/List;");
 
-        if (!listRef.isNull()) {
-            QJNIObject list(listRef.object());
+        if (list.isValid()) {
             int count = list.callMethod<jint>("size");
             for (int i = 0; i < count; ++i) {
-                QJNILocalRef<jobject> areaRef = list.callObjectMethod<jobject>("get",
-                                                                               "(I)Ljava/lang/Object;",
-                                                                               i);
+                QJNIObjectPrivate area = list.callObjectMethod("get",
+                                                               "(I)Ljava/lang/Object;",
+                                                               i);
 
-                areas.append(areaToRect(areaRef.object()));
+                areas.append(areaToRect(area.object()));
             }
         }
     }
@@ -401,14 +389,14 @@ QList<QRect> JCamera::getFocusAreas()
 
 void JCamera::setFocusAreas(const QList<QRect> &areas)
 {
-    if (!m_hasAPI14 || !m_parameters || !m_parameters->isValid())
+    if (!m_hasAPI14 || !m_parameters.isValid())
         return;
 
-    QJNILocalRef<jobject> list(0);
+    QJNIObjectPrivate list;
 
     if (!areas.isEmpty()) {
-        QAttachedJNIEnv env;
-        QJNIObject arrayList("java/util/ArrayList", "(I)V", areas.size());
+        QJNIEnvironmentPrivate env;
+        QJNIObjectPrivate arrayList("java/util/ArrayList", "(I)V", areas.size());
         for (int i = 0; i < areas.size(); ++i) {
             arrayList.callMethod<jboolean>("add",
                                            "(Ljava/lang/Object;)Z",
@@ -416,10 +404,10 @@ void JCamera::setFocusAreas(const QList<QRect> &areas)
             if (env->ExceptionCheck())
                 env->ExceptionClear();
         }
-        list = env->NewLocalRef(arrayList.object());
+        list = arrayList;
     }
 
-    m_parameters->callMethod<void>("setFocusAreas", "(Ljava/util/List;)V", list.object());
+    m_parameters.callMethod<void>("setFocusAreas", "(Ljava/util/List;)V", list.object());
 
     applyParameters();
 }
@@ -437,93 +425,93 @@ void JCamera::cancelAutoFocus()
 
 bool JCamera::isAutoExposureLockSupported()
 {
-    if (!m_hasAPI14 || !m_parameters || !m_parameters->isValid())
+    if (!m_hasAPI14 || !m_parameters.isValid())
         return false;
 
-    return m_parameters->callMethod<jboolean>("isAutoExposureLockSupported");
+    return m_parameters.callMethod<jboolean>("isAutoExposureLockSupported");
 }
 
 bool JCamera::getAutoExposureLock()
 {
-    if (!m_hasAPI14 || !m_parameters || !m_parameters->isValid())
+    if (!m_hasAPI14 || !m_parameters.isValid())
         return false;
 
-    return m_parameters->callMethod<jboolean>("getAutoExposureLock");
+    return m_parameters.callMethod<jboolean>("getAutoExposureLock");
 }
 
 void JCamera::setAutoExposureLock(bool toggle)
 {
-    if (!m_hasAPI14 || !m_parameters || !m_parameters->isValid())
+    if (!m_hasAPI14 || !m_parameters.isValid())
         return;
 
-    m_parameters->callMethod<void>("setAutoExposureLock", "(Z)V", toggle);
+    m_parameters.callMethod<void>("setAutoExposureLock", "(Z)V", toggle);
     applyParameters();
 }
 
 bool JCamera::isAutoWhiteBalanceLockSupported()
 {
-    if (!m_hasAPI14 || !m_parameters || !m_parameters->isValid())
+    if (!m_hasAPI14 || !m_parameters.isValid())
         return false;
 
-    return m_parameters->callMethod<jboolean>("isAutoWhiteBalanceLockSupported");
+    return m_parameters.callMethod<jboolean>("isAutoWhiteBalanceLockSupported");
 }
 
 bool JCamera::getAutoWhiteBalanceLock()
 {
-    if (!m_hasAPI14 || !m_parameters || !m_parameters->isValid())
+    if (!m_hasAPI14 || !m_parameters.isValid())
         return false;
 
-    return m_parameters->callMethod<jboolean>("getAutoWhiteBalanceLock");
+    return m_parameters.callMethod<jboolean>("getAutoWhiteBalanceLock");
 }
 
 void JCamera::setAutoWhiteBalanceLock(bool toggle)
 {
-    if (!m_hasAPI14 || !m_parameters || !m_parameters->isValid())
+    if (!m_hasAPI14 || !m_parameters.isValid())
         return;
 
-    m_parameters->callMethod<void>("setAutoWhiteBalanceLock", "(Z)V", toggle);
+    m_parameters.callMethod<void>("setAutoWhiteBalanceLock", "(Z)V", toggle);
     applyParameters();
 }
 
 int JCamera::getExposureCompensation()
 {
-    if (!m_parameters || !m_parameters->isValid())
+    if (!m_parameters.isValid())
         return 0;
 
-    return m_parameters->callMethod<jint>("getExposureCompensation");
+    return m_parameters.callMethod<jint>("getExposureCompensation");
 }
 
 void JCamera::setExposureCompensation(int value)
 {
-    if (!m_parameters || !m_parameters->isValid())
+    if (!m_parameters.isValid())
         return;
 
-    m_parameters->callMethod<void>("setExposureCompensation", "(I)V", value);
+    m_parameters.callMethod<void>("setExposureCompensation", "(I)V", value);
     applyParameters();
 }
 
 float JCamera::getExposureCompensationStep()
 {
-    if (!m_parameters || !m_parameters->isValid())
+    if (!m_parameters.isValid())
         return 0;
 
-    return m_parameters->callMethod<jfloat>("getExposureCompensationStep");
+    return m_parameters.callMethod<jfloat>("getExposureCompensationStep");
 }
 
 int JCamera::getMinExposureCompensation()
 {
-    if (!m_parameters || !m_parameters->isValid())
+    if (!m_parameters.isValid())
         return 0;
 
-    return m_parameters->callMethod<jint>("getMinExposureCompensation");
+    return m_parameters.callMethod<jint>("getMinExposureCompensation");
 }
 
 int JCamera::getMaxExposureCompensation()
 {
-    if (!m_parameters || !m_parameters->isValid())
+    if (!m_parameters.isValid())
         return 0;
 
-    return m_parameters->callMethod<jint>("getMaxExposureCompensation");
+    return m_parameters.callMethod<jint>("getMaxExposureCompensation");
 }
 
 QStringList JCamera::getSupportedSceneModes()
@@ -535,11 +523,11 @@ QString JCamera::getSceneMode()
 {
     QString value;
 
-    if (m_parameters && m_parameters->isValid()) {
-        QJNILocalRef<jstring> sceneMode = m_parameters->callObjectMethod<jstring>("getSceneMode",
-                                                                                  "()Ljava/lang/String;");
-        if (!sceneMode.isNull())
-            value = qt_convertJString(sceneMode.object());
+    if (m_parameters.isValid()) {
+        QJNIObjectPrivate sceneMode = m_parameters.callObjectMethod("getSceneMode",
+                                                                    "()Ljava/lang/String;");
+        if (sceneMode.isValid())
+            value = sceneMode.toString();
     }
 
     return value;
@@ -547,12 +535,12 @@ QString JCamera::getSceneMode()
 
 void JCamera::setSceneMode(const QString &value)
 {
-    if (!m_parameters || !m_parameters->isValid())
+    if (!m_parameters.isValid())
         return;
 
-    m_parameters->callMethod<void>("setSceneMode",
-                                   "(Ljava/lang/String;)V",
-                                   qt_toJString(value).object());
+    m_parameters.callMethod<void>("setSceneMode",
+                                  "(Ljava/lang/String;)V",
+                                  QJNIObjectPrivate::fromString(value).object());
     applyParameters();
 }
 
@@ -565,11 +553,11 @@ QString JCamera::getWhiteBalance()
 {
     QString value;
 
-    if (m_parameters && m_parameters->isValid()) {
-        QJNILocalRef<jstring> wb = m_parameters->callObjectMethod<jstring>("getWhiteBalance",
-                                                                           "()Ljava/lang/String;");
-        if (!wb.isNull())
-            value = qt_convertJString(wb.object());
+    if (m_parameters.isValid()) {
+        QJNIObjectPrivate wb = m_parameters.callObjectMethod("getWhiteBalance",
+                                                             "()Ljava/lang/String;");
+        if (wb.isValid())
+            value = wb.toString();
     }
 
     return value;
@@ -577,12 +565,12 @@ QString JCamera::getWhiteBalance()
 
 void JCamera::setWhiteBalance(const QString &value)
 {
-    if (!m_parameters || !m_parameters->isValid())
+    if (!m_parameters.isValid())
         return;
 
-    m_parameters->callMethod<void>("setWhiteBalance",
-                                   "(Ljava/lang/String;)V",
-                                   qt_toJString(value).object());
+    m_parameters.callMethod<void>("setWhiteBalance",
+                                  "(Ljava/lang/String;)V",
+                                  QJNIObjectPrivate::fromString(value).object());
     applyParameters();
 
     emit whiteBalanceChanged();
@@ -590,10 +578,10 @@ void JCamera::setWhiteBalance(const QString &value)
 
 void JCamera::setRotation(int rotation)
 {
-    if (!m_parameters || !m_parameters->isValid())
+    if (!m_parameters.isValid())
         return;
 
-    m_parameters->callMethod<void>("setRotation", "(I)V", rotation);
+    m_parameters.callMethod<void>("setRotation", "(I)V", rotation);
     applyParameters();
 }
 
@@ -601,16 +589,14 @@ QList<QSize> JCamera::getSupportedPictureSizes()
 {
     QList<QSize> list;
 
-    if (m_parameters && m_parameters->isValid()) {
-        QJNILocalRef<jobject> sizeListRef = m_parameters->callObjectMethod<jobject>("getSupportedPictureSizes",
-                                                                                    "()Ljava/util/List;");
-        QJNIObject sizeList(sizeListRef.object());
+    if (m_parameters.isValid()) {
+        QJNIObjectPrivate sizeList = m_parameters.callObjectMethod("getSupportedPictureSizes",
+                                                                   "()Ljava/util/List;");
         int count = sizeList.callMethod<jint>("size");
         for (int i = 0; i < count; ++i) {
-            QJNILocalRef<jobject> sizeRef = sizeList.callObjectMethod<jobject>("get",
-                                                                               "(I)Ljava/lang/Object;",
-                                                                               i);
-            QJNIObject size(sizeRef.object());
+            QJNIObjectPrivate size = sizeList.callObjectMethod("get",
+                                                               "(I)Ljava/lang/Object;",
+                                                               i);
             list.append(QSize(size.getField<jint>("width"), size.getField<jint>("height")));
         }
 
@@ -622,19 +608,19 @@ QList<QSize> JCamera::getSupportedPictureSizes()
 
 void JCamera::setPictureSize(const QSize &size)
 {
-    if (!m_parameters || !m_parameters->isValid())
+    if (!m_parameters.isValid())
         return;
 
-    m_parameters->callMethod<void>("setPictureSize", "(II)V", size.width(), size.height());
+    m_parameters.callMethod<void>("setPictureSize", "(II)V", size.width(), size.height());
     applyParameters();
 }
 
 void JCamera::setJpegQuality(int quality)
 {
-    if (!m_parameters || !m_parameters->isValid())
+    if (!m_parameters.isValid())
         return;
 
-    m_parameters->callMethod<void>("setJpegQuality", "(I)V", quality);
+    m_parameters.callMethod<void>("setJpegQuality", "(I)V", quality);
     applyParameters();
 }
 
@@ -657,27 +643,25 @@ void JCamera::applyParameters()
 {
     callMethod<void>("setParameters",
                      "(Landroid/hardware/Camera$Parameters;)V",
-                     m_parameters->object());
+                     m_parameters.object());
 }
 
 QStringList JCamera::callStringListMethod(const char *methodName)
 {
     QStringList stringList;
 
-    if (m_parameters && m_parameters->isValid()) {
-        QJNILocalRef<jobject> listRef = m_parameters->callObjectMethod<jobject>(methodName,
-                                                                                "()Ljava/util/List;");
+    if (m_parameters.isValid()) {
+        QJNIObjectPrivate list = m_parameters.callObjectMethod(methodName,
+                                                               "()Ljava/util/List;");
 
-        if (!listRef.isNull()) {
-            QJNIObject list(listRef.object());
+        if (list.isValid()) {
             int count = list.callMethod<jint>("size");
             for (int i = 0; i < count; ++i) {
-                QJNILocalRef<jobject> stringRef = list.callObjectMethod<jobject>("get",
-                                                                                 "(I)Ljava/lang/Object;",
-                                                                                 i);
+                QJNIObjectPrivate string = list.callObjectMethod("get",
+                                                                 "(I)Ljava/lang/Object;",
+                                                                 i);
 
-                QJNIObject string(stringRef.object());
-                stringList.append(qt_convertJString(string.callObjectMethod<jstring>("toString").object()));
+                stringList.append(string.toString());
             }
         }
     }
diff --git a/src/plugins/android/src/wrappers/jcamera.h b/src/plugins/android/src/wrappers/jcamera.h
index 10062872196a3f3f5f3a438801290c9b96b6d2d3..0aea81f38b76b079380ef024e61018f33dd7244e 100644
--- a/src/plugins/android/src/wrappers/jcamera.h
+++ b/src/plugins/android/src/wrappers/jcamera.h
@@ -43,13 +43,13 @@
 #define JCAMERA_H
 
 #include <qobject.h>
-#include <QtPlatformSupport/private/qjniobject_p.h>
+#include <QtCore/private/qjni_p.h>
 #include <qsize.h>
 #include <qrect.h>
 
 QT_BEGIN_NAMESPACE
 
-class JCamera : public QObject, public QJNIObject
+class JCamera : public QObject, public QJNIObjectPrivate
 {
     Q_OBJECT
 public:
@@ -153,8 +153,8 @@ private:
     QStringList callStringListMethod(const char *methodName);
 
     int m_cameraId;
-    QJNIObject *m_info;
-    QJNIObject *m_parameters;
+    QJNIObjectPrivate m_info;
+    QJNIObjectPrivate m_parameters;
 
     QSize m_previewSize;
 
diff --git a/src/plugins/android/src/wrappers/jmediametadataretriever.cpp b/src/plugins/android/src/wrappers/jmediametadataretriever.cpp
index ae5abcf433698eb5b4ff68635146430daddcdae7..91c40905cc89526cfe7367a0043c93bcbc38aa37 100644
--- a/src/plugins/android/src/wrappers/jmediametadataretriever.cpp
+++ b/src/plugins/android/src/wrappers/jmediametadataretriever.cpp
@@ -41,21 +41,14 @@
 
 #include "jmediametadataretriever.h"
 
-#include <QtPlatformSupport/private/qjnihelpers_p.h>
-#include <qpa/qplatformnativeinterface.h>
-#include <qguiapplication.h>
+#include <QtCore/private/qjnihelpers_p.h>
+#include <QtCore/private/qjni_p.h>
 
 QT_BEGIN_NAMESPACE
 
-static jobject g_activity = 0;
-
 JMediaMetadataRetriever::JMediaMetadataRetriever()
-    : QJNIObject("android/media/MediaMetadataRetriever")
+    : QJNIObjectPrivate("android/media/MediaMetadataRetriever")
 {
-    if (!g_activity) {
-        QPlatformNativeInterface *nativeInterface = QGuiApplication::platformNativeInterface();
-        g_activity = static_cast<jobject>(nativeInterface->nativeResourceForIntegration("QtActivity"));
-    }
 }
 
 JMediaMetadataRetriever::~JMediaMetadataRetriever()
@@ -66,11 +59,11 @@ QString JMediaMetadataRetriever::extractMetadata(MetadataKey key)
 {
     QString value;
 
-    QJNILocalRef<jstring> metadata = callObjectMethod<jstring>("extractMetadata",
-                                                               "(I)Ljava/lang/String;",
-                                                               jint(key));
-    if (!metadata.isNull())
-        value = qt_convertJString(metadata.object());
+    QJNIObjectPrivate metadata = callObjectMethod("extractMetadata",
+                                           "(I)Ljava/lang/String;",
+                                           jint(key));
+    if (metadata.isValid())
+        value = metadata.toString();
 
     return value;
 }
@@ -82,22 +75,22 @@ void JMediaMetadataRetriever::release()
 
 bool JMediaMetadataRetriever::setDataSource(const QUrl &url)
 {
-    QAttachedJNIEnv env;
+    QJNIEnvironmentPrivate env;
 
     bool loaded = false;
 
-    QJNILocalRef<jstring> string = qt_toJString(url.toString());
+    QJNIObjectPrivate string = QJNIObjectPrivate::fromString(url.toString());
 
-    QJNILocalRef<jobject> uri = callStaticObjectMethod<jobject>("android/net/Uri",
-                                                                "parse",
-                                                                "(Ljava/lang/String;)Landroid/net/Uri;",
-                                                                string.object());
+    QJNIObjectPrivate uri = callStaticObjectMethod("android/net/Uri",
+                                                   "parse",
+                                                   "(Ljava/lang/String;)Landroid/net/Uri;",
+                                                   string.object());
     if (env->ExceptionCheck()) {
         env->ExceptionClear();
     } else {
         callMethod<void>("setDataSource",
                          "(Landroid/content/Context;Landroid/net/Uri;)V",
-                         g_activity,
+                         QtAndroidPrivate::activity(),
                          uri.object());
         if (env->ExceptionCheck())
             env->ExceptionClear();
@@ -110,11 +103,13 @@ bool JMediaMetadataRetriever::setDataSource(const QUrl &url)
 
 bool JMediaMetadataRetriever::setDataSource(const QString &path)
 {
-    QAttachedJNIEnv env;
+    QJNIEnvironmentPrivate env;
 
     bool loaded = false;
 
-    callMethod<void>("setDataSource", "(Ljava/lang/String;)V", qt_toJString(path).object());
+    callMethod<void>("setDataSource",
+                     "(Ljava/lang/String;)V",
+                     QJNIObjectPrivate::fromString(path).object());
     if (env->ExceptionCheck())
         env->ExceptionClear();
     else
diff --git a/src/plugins/android/src/wrappers/jmediametadataretriever.h b/src/plugins/android/src/wrappers/jmediametadataretriever.h
index dd63e0d873c06b437d77c1d3a6a5fdecb7f8037c..7b22c955d8715c31ef9321503d6cd9ae1155c326 100644
--- a/src/plugins/android/src/wrappers/jmediametadataretriever.h
+++ b/src/plugins/android/src/wrappers/jmediametadataretriever.h
@@ -42,12 +42,12 @@
 #ifndef JMEDIAMETADATARETRIEVER_H
 #define JMEDIAMETADATARETRIEVER_H
 
-#include <QtPlatformSupport/private/qjniobject_p.h>
+#include <QtCore/private/qjni_p.h>
 #include <qurl.h>
 
 QT_BEGIN_NAMESPACE
 
-class JMediaMetadataRetriever : public QJNIObject
+class JMediaMetadataRetriever : public QJNIObjectPrivate
 {
 public:
     enum MetadataKey {
diff --git a/src/plugins/android/src/wrappers/jmediaplayer.cpp b/src/plugins/android/src/wrappers/jmediaplayer.cpp
index f6e03ee2259d12083cc47404fa3153da0b6720bd..3d7f7f9d1f2deafa00e8e129f93f8ad38dcdabba 100644
--- a/src/plugins/android/src/wrappers/jmediaplayer.cpp
+++ b/src/plugins/android/src/wrappers/jmediaplayer.cpp
@@ -42,9 +42,9 @@
 #include "jmediaplayer.h"
 
 #include <QString>
-#include <qpa/qplatformnativeinterface.h>
-#include <qguiapplication.h>
-#include <QtPlatformSupport/private/qjnihelpers_p.h>
+#include <QtCore/private/qjni_p.h>
+#include <QtCore/private/qjnihelpers_p.h>
+#include <QMap>
 
 namespace {
 
@@ -60,19 +60,17 @@ bool JMediaPlayer::mActivitySet = false;
 
 JMediaPlayer::JMediaPlayer()
     : QObject()
-    , QJNIObject(mediaPlayerClass, "(J)V", reinterpret_cast<jlong>(this))
+    , QJNIObjectPrivate(mediaPlayerClass, "(J)V", reinterpret_cast<jlong>(this))
     , mId(reinterpret_cast<jlong>(this))
     , mDisplay(0)
 {
     mplayers.insert(mId, this);
 
     if (!mActivitySet) {
-        QPlatformNativeInterface *nativeInterface = QGuiApplication::platformNativeInterface();
-        jobject activity = static_cast<jobject>(nativeInterface->nativeResourceForIntegration("QtActivity"));
-        QJNIObject::callStaticMethod<void>(mediaPlayerClass,
+        QJNIObjectPrivate::callStaticMethod<void>(mediaPlayerClass,
                                            "setActivity",
                                            "(Landroid/app/Activity;)V",
-                                           activity);
+                                           QtAndroidPrivate::activity());
         mActivitySet = true;
     }
 }
@@ -164,7 +162,7 @@ void JMediaPlayer::setMuted(bool mute)
 
 void JMediaPlayer::setDataSource(const QString &path)
 {
-    QJNILocalRef<jstring> string = qt_toJString(path);
+    QJNIObjectPrivate string = QJNIObjectPrivate::fromString(path);
     callMethod<void>("setMediaPath", "(Ljava/lang/String;)V", string.object());
 }
 
diff --git a/src/plugins/android/src/wrappers/jmediaplayer.h b/src/plugins/android/src/wrappers/jmediaplayer.h
index 710246b9a40bba0a5a831baa5a462336fbcdde96..c737cfa269e9edae3069a4ec71ef29a7b1489eda 100644
--- a/src/plugins/android/src/wrappers/jmediaplayer.h
+++ b/src/plugins/android/src/wrappers/jmediaplayer.h
@@ -43,11 +43,11 @@
 #define QANDROIDMEDIAPLAYER_H
 
 #include <QObject>
-#include <QtPlatformSupport/private/qjniobject_p.h>
+#include <QtCore/private/qjni_p.h>
 
 QT_BEGIN_NAMESPACE
 
-class JMediaPlayer : public QObject, public QJNIObject
+class JMediaPlayer : public QObject, public QJNIObjectPrivate
 {
     Q_OBJECT
 public:
diff --git a/src/plugins/android/src/wrappers/jmediarecorder.cpp b/src/plugins/android/src/wrappers/jmediarecorder.cpp
index b7cbe572456980b4dbbe70bcabb8ff8579c5e8b3..1a9ee33f7201041a8de9dc63f91d38ea6281a99e 100644
--- a/src/plugins/android/src/wrappers/jmediarecorder.cpp
+++ b/src/plugins/android/src/wrappers/jmediarecorder.cpp
@@ -42,7 +42,7 @@
 #include "jmediarecorder.h"
 
 #include "jcamera.h"
-#include <QtPlatformSupport/private/qjnihelpers_p.h>
+#include <QtCore/private/qjni_p.h>
 #include <qmap.h>
 
 QT_BEGIN_NAMESPACE
@@ -66,7 +66,7 @@ static void notifyInfo(JNIEnv* , jobject, jlong id, jint what, jint extra)
 
 JMediaRecorder::JMediaRecorder()
     : QObject()
-    , QJNIObject(g_qtMediaRecorderClass, "(J)V", reinterpret_cast<jlong>(this))
+    , QJNIObjectPrivate(g_qtMediaRecorderClass, "(J)V", reinterpret_cast<jlong>(this))
     , m_id(reinterpret_cast<jlong>(this))
 {
     if (isValid())
@@ -85,7 +85,7 @@ void JMediaRecorder::release()
 
 bool JMediaRecorder::prepare()
 {
-    QAttachedJNIEnv env;
+    QJNIEnvironmentPrivate env;
     callMethod<void>("prepare");
     if (env->ExceptionCheck()) {
         env->ExceptionClear();
@@ -101,7 +101,7 @@ void JMediaRecorder::reset()
 
 bool JMediaRecorder::start()
 {
-    QAttachedJNIEnv env;
+    QJNIEnvironmentPrivate env;
     callMethod<void>("start");
     if (env->ExceptionCheck()) {
         env->ExceptionClear();
@@ -112,7 +112,7 @@ bool JMediaRecorder::start()
 
 void JMediaRecorder::stop()
 {
-    QAttachedJNIEnv env;
+    QJNIEnvironmentPrivate env;
     callMethod<void>("stop");
     if (env->ExceptionCheck())
         env->ExceptionClear();
@@ -125,7 +125,7 @@ void JMediaRecorder::setAudioChannels(int numChannels)
 
 void JMediaRecorder::setAudioEncoder(AudioEncoder encoder)
 {
-    QAttachedJNIEnv env;
+    QJNIEnvironmentPrivate env;
     callMethod<void>("setAudioEncoder", "(I)V", int(encoder));
     if (env->ExceptionCheck())
         env->ExceptionClear();
@@ -143,7 +143,7 @@ void JMediaRecorder::setAudioSamplingRate(int samplingRate)
 
 void JMediaRecorder::setAudioSource(AudioSource source)
 {
-    QAttachedJNIEnv env;
+    QJNIEnvironmentPrivate env;
     callMethod<void>("setAudioSource", "(I)V", int(source));
     if (env->ExceptionCheck())
         env->ExceptionClear();
@@ -151,13 +151,13 @@ void JMediaRecorder::setAudioSource(AudioSource source)
 
 void JMediaRecorder::setCamera(JCamera *camera)
 {
-    QJNILocalRef<jobject> cam = camera->getObjectField<jobject>("m_camera", "Landroid/hardware/Camera;");
+    QJNIObjectPrivate cam = camera->getObjectField("m_camera", "Landroid/hardware/Camera;");
     callMethod<void>("setCamera", "(Landroid/hardware/Camera;)V", cam.object());
 }
 
 void JMediaRecorder::setVideoEncoder(VideoEncoder encoder)
 {
-    QAttachedJNIEnv env;
+    QJNIEnvironmentPrivate env;
     callMethod<void>("setVideoEncoder", "(I)V", int(encoder));
     if (env->ExceptionCheck())
         env->ExceptionClear();
@@ -170,7 +170,7 @@ void JMediaRecorder::setVideoEncodingBitRate(int bitRate)
 
 void JMediaRecorder::setVideoFrameRate(int rate)
 {
-    QAttachedJNIEnv env;
+    QJNIEnvironmentPrivate env;
     callMethod<void>("setVideoFrameRate", "(I)V", rate);
     if (env->ExceptionCheck())
         env->ExceptionClear();
@@ -178,7 +178,7 @@ void JMediaRecorder::setVideoFrameRate(int rate)
 
 void JMediaRecorder::setVideoSize(const QSize &size)
 {
-    QAttachedJNIEnv env;
+    QJNIEnvironmentPrivate env;
     callMethod<void>("setVideoSize", "(II)V", size.width(), size.height());
     if (env->ExceptionCheck())
         env->ExceptionClear();
@@ -186,7 +186,7 @@ void JMediaRecorder::setVideoSize(const QSize &size)
 
 void JMediaRecorder::setVideoSource(VideoSource source)
 {
-    QAttachedJNIEnv env;
+    QJNIEnvironmentPrivate env;
     callMethod<void>("setVideoSource", "(I)V", int(source));
     if (env->ExceptionCheck())
         env->ExceptionClear();
@@ -194,7 +194,7 @@ void JMediaRecorder::setVideoSource(VideoSource source)
 
 void JMediaRecorder::setOrientationHint(int degrees)
 {
-    QAttachedJNIEnv env;
+    QJNIEnvironmentPrivate env;
     callMethod<void>("setOrientationHint", "(I)V", degrees);
     if (env->ExceptionCheck())
         env->ExceptionClear();
@@ -202,7 +202,7 @@ void JMediaRecorder::setOrientationHint(int degrees)
 
 void JMediaRecorder::setOutputFormat(OutputFormat format)
 {
-    QAttachedJNIEnv env;
+    QJNIEnvironmentPrivate env;
     callMethod<void>("setOutputFormat", "(I)V", int(format));
     if (env->ExceptionCheck())
         env->ExceptionClear();
@@ -210,8 +210,10 @@ void JMediaRecorder::setOutputFormat(OutputFormat format)
 
 void JMediaRecorder::setOutputFile(const QString &path)
 {
-    QAttachedJNIEnv env;
-    callMethod<void>("setOutputFile", "(Ljava/lang/String;)V", qt_toJString(path).object());
+    QJNIEnvironmentPrivate env;
+    callMethod<void>("setOutputFile",
+                     "(Ljava/lang/String;)V",
+                     QJNIObjectPrivate::fromString(path).object());
     if (env->ExceptionCheck())
         env->ExceptionClear();
 }
diff --git a/src/plugins/android/src/wrappers/jmediarecorder.h b/src/plugins/android/src/wrappers/jmediarecorder.h
index ef26b8a72a6b8f367bbaad25ac8c970d2e6a036d..2bdb06b9ff8b77f3fb44d0b85f0ee06c490df3ca 100644
--- a/src/plugins/android/src/wrappers/jmediarecorder.h
+++ b/src/plugins/android/src/wrappers/jmediarecorder.h
@@ -43,14 +43,14 @@
 #define JMEDIARECORDER_H
 
 #include <qobject.h>
-#include <QtPlatformSupport/private/qjniobject_p.h>
+#include <QtCore/private/qjni_p.h>
 #include <qsize.h>
 
 QT_BEGIN_NAMESPACE
 
 class JCamera;
 
-class JMediaRecorder : public QObject, public QJNIObject
+class JMediaRecorder : public QObject, public QJNIObjectPrivate
 {
     Q_OBJECT
 public:
diff --git a/src/plugins/android/src/wrappers/jmultimediautils.cpp b/src/plugins/android/src/wrappers/jmultimediautils.cpp
index 6832e6b6ed1ab19880428ce2cbbdfacfe93ff570..a20d54477dca9fc98e369b946ca95993edd488ac 100644
--- a/src/plugins/android/src/wrappers/jmultimediautils.cpp
+++ b/src/plugins/android/src/wrappers/jmultimediautils.cpp
@@ -41,7 +41,7 @@
 
 #include "jmultimediautils.h"
 
-#include <QtPlatformSupport/private/qjnihelpers_p.h>
+#include <QtCore/private/qjni_p.h>
 
 QT_BEGIN_NAMESPACE
 
@@ -49,7 +49,7 @@ static jclass g_qtMultimediaUtilsClass = 0;
 
 JMultimediaUtils::JMultimediaUtils()
     : QObject()
-    , QJNIObject(g_qtMultimediaUtilsClass)
+    , QJNIObjectPrivate(g_qtMultimediaUtilsClass)
 {
 }
 
@@ -65,11 +65,11 @@ int JMultimediaUtils::getDeviceOrientation()
 
 QString JMultimediaUtils::getDefaultMediaDirectory(MediaType type)
 {
-    QJNILocalRef<jstring> path = callStaticObjectMethod<jstring>(g_qtMultimediaUtilsClass,
-                                                                 "getDefaultMediaDirectory",
-                                                                 "(I)Ljava/lang/String;",
-                                                                 jint(type));
-    return qt_convertJString(path.object());
+    QJNIObjectPrivate path = callStaticObjectMethod(g_qtMultimediaUtilsClass,
+                                                    "getDefaultMediaDirectory",
+                                                    "(I)Ljava/lang/String;",
+                                                    jint(type));
+    return path.toString();
 }
 
 void JMultimediaUtils::registerMediaFile(const QString &file)
@@ -77,7 +77,7 @@ void JMultimediaUtils::registerMediaFile(const QString &file)
     callStaticMethod<void>(g_qtMultimediaUtilsClass,
                            "registerMediaFile",
                            "(Ljava/lang/String;)V",
-                           qt_toJString(file).object());
+                           QJNIObjectPrivate::fromString(file).object());
 }
 
 bool JMultimediaUtils::initJNI(JNIEnv *env)
diff --git a/src/plugins/android/src/wrappers/jmultimediautils.h b/src/plugins/android/src/wrappers/jmultimediautils.h
index 909f5c1554a190942460d8acc6e4c4601130e569..9896f7f314a394e4df2dce05c44f5f99232935e4 100644
--- a/src/plugins/android/src/wrappers/jmultimediautils.h
+++ b/src/plugins/android/src/wrappers/jmultimediautils.h
@@ -43,11 +43,11 @@
 #define JMULTIMEDIAUTILS_H
 
 #include <qobject.h>
-#include <QtPlatformSupport/private/qjniobject_p.h>
+#include <QtCore/private/qjni_p.h>
 
 QT_BEGIN_NAMESPACE
 
-class JMultimediaUtils : public QObject, public QJNIObject
+class JMultimediaUtils : public QObject, public QJNIObjectPrivate
 {
     Q_OBJECT
 public:
diff --git a/src/plugins/android/src/wrappers/jsurfacetexture.cpp b/src/plugins/android/src/wrappers/jsurfacetexture.cpp
index 60c85cdf0ebd9abb9068adac9aa86bbeae5618e5..1505443a860372346f567e7e774341d66814e892 100644
--- a/src/plugins/android/src/wrappers/jsurfacetexture.cpp
+++ b/src/plugins/android/src/wrappers/jsurfacetexture.cpp
@@ -40,7 +40,7 @@
 ****************************************************************************/
 
 #include "jsurfacetexture.h"
-#include <QtPlatformSupport/private/qjnihelpers_p.h>
+#include <QtCore/private/qjni_p.h>
 
 QT_BEGIN_NAMESPACE
 
@@ -57,7 +57,7 @@ static void notifyFrameAvailable(JNIEnv* , jobject, int id)
 
 JSurfaceTexture::JSurfaceTexture(unsigned int texName)
     : QObject()
-    , QJNIObject(g_qtSurfaceTextureClass, "(I)V", jint(texName))
+    , QJNIObjectPrivate(g_qtSurfaceTextureClass, "(I)V", jint(texName))
     , m_texID(int(texName))
 {
     if (isValid())
@@ -72,7 +72,7 @@ JSurfaceTexture::~JSurfaceTexture()
 
 QMatrix4x4 JSurfaceTexture::getTransformMatrix()
 {
-    QAttachedJNIEnv env;
+    QJNIEnvironmentPrivate env;
 
     QMatrix4x4 matrix;
     jfloatArray array = env->NewFloatArray(16);
diff --git a/src/plugins/android/src/wrappers/jsurfacetexture.h b/src/plugins/android/src/wrappers/jsurfacetexture.h
index 2a2f27ae37c998f7ef76e76a9c4badb5667bcc70..d65fc01e90639a8958ae6167d21ab371b5708232 100644
--- a/src/plugins/android/src/wrappers/jsurfacetexture.h
+++ b/src/plugins/android/src/wrappers/jsurfacetexture.h
@@ -43,13 +43,13 @@
 #define JSURFACETEXTURE_H
 
 #include <qobject.h>
-#include <QtPlatformSupport/private/qjniobject_p.h>
+#include <QtCore/private/qjni_p.h>
 
 #include <QMatrix4x4>
 
 QT_BEGIN_NAMESPACE
 
-class JSurfaceTexture : public QObject, public QJNIObject
+class JSurfaceTexture : public QObject, public QJNIObjectPrivate
 {
     Q_OBJECT
 public:
diff --git a/src/plugins/android/src/wrappers/jsurfacetextureholder.cpp b/src/plugins/android/src/wrappers/jsurfacetextureholder.cpp
index 4ec8935c26c8004060c9a010a84eb6420a38eab9..b6d1433d1df2821e2ddf6099eba97775f6d85537 100644
--- a/src/plugins/android/src/wrappers/jsurfacetextureholder.cpp
+++ b/src/plugins/android/src/wrappers/jsurfacetextureholder.cpp
@@ -46,7 +46,7 @@ QT_BEGIN_NAMESPACE
 static jclass g_qtSurfaceTextureHolderClass = 0;
 
 JSurfaceTextureHolder::JSurfaceTextureHolder(jobject surface)
-    : QJNIObject(g_qtSurfaceTextureHolderClass, "(Landroid/view/Surface;)V", surface)
+    : QJNIObjectPrivate(g_qtSurfaceTextureHolderClass, "(Landroid/view/Surface;)V", surface)
 {
 }
 
diff --git a/src/plugins/android/src/wrappers/jsurfacetextureholder.h b/src/plugins/android/src/wrappers/jsurfacetextureholder.h
index 5b567de3a3e46a77645ae7224744ed8d48a3d009..556cb4a4020bf9cf2972c54748725fdf3de9350a 100644
--- a/src/plugins/android/src/wrappers/jsurfacetextureholder.h
+++ b/src/plugins/android/src/wrappers/jsurfacetextureholder.h
@@ -42,11 +42,11 @@
 #ifndef JSURFACETEXTUREHOLDER_H
 #define JSURFACETEXTUREHOLDER_H
 
-#include <QtPlatformSupport/private/qjniobject_p.h>
+#include <QtCore/private/qjni_p.h>
 
 QT_BEGIN_NAMESPACE
 
-class JSurfaceTextureHolder : public QJNIObject
+class JSurfaceTextureHolder : public QJNIObjectPrivate
 {
 public:
     JSurfaceTextureHolder(jobject surface);