Android: Fix QtMediaRecorder
authorChristian Strømme <christian.stromme@digia.com>
Mon, 7 Apr 2014 13:09:00 +0000 (15:09 +0200)
committerThe Qt Project <gerrit-noreply@qt-project.org>
Mon, 7 Apr 2014 22:21:41 +0000 (00:21 +0200)
Don't extend the MediaRecorder class as this causes ART to fail when it
doesn't find the postEventFromNative() function.

Task-number: QTBUG-38166

Change-Id: Ia38ce4558a2cc95a9b4cd05b9f926d41e53fdc0d
Reviewed-by: Yoann Lopes <yoann.lopes@digia.com>
src/plugins/android/jar/jar.pri
src/plugins/android/jar/src/org/qtproject/qt5/android/multimedia/QtMediaRecorderListener.java [moved from src/plugins/android/jar/src/org/qtproject/qt5/android/multimedia/QtMediaRecorder.java with 91% similarity]
src/plugins/android/src/wrappers/jmediarecorder.cpp

index e56e3d9..d8bc59a 100644 (file)
@@ -10,7 +10,7 @@ JAVASOURCES += $$PWD/src/org/qtproject/qt5/android/multimedia/QtAndroidMediaPlay
                $$PWD/src/org/qtproject/qt5/android/multimedia/QtSurfaceTextureListener.java \
                $$PWD/src/org/qtproject/qt5/android/multimedia/QtSurfaceTextureHolder.java \
                $$PWD/src/org/qtproject/qt5/android/multimedia/QtMultimediaUtils.java \
-               $$PWD/src/org/qtproject/qt5/android/multimedia/QtMediaRecorder.java
+               $$PWD/src/org/qtproject/qt5/android/multimedia/QtMediaRecorderListener.java
 
 # install
 target.path = $$[QT_INSTALL_PREFIX]/jar
@@ -43,16 +43,13 @@ package org.qtproject.qt5.android.multimedia;
 
 import android.media.MediaRecorder;
 
-public class QtMediaRecorder extends MediaRecorder implements MediaRecorder.OnErrorListener, MediaRecorder.OnInfoListener
+public class QtMediaRecorderListener implements MediaRecorder.OnErrorListener, MediaRecorder.OnInfoListener
 {
     private long m_id = -1;
 
-    public QtMediaRecorder(long id)
+    public QtMediaRecorderListener(long id)
     {
-        super();
         m_id = id;
-        setOnErrorListener(this);
-        setOnInfoListener(this);
     }
 
     @Override
index 8526728..675bc5d 100644 (file)
@@ -47,7 +47,7 @@
 
 QT_BEGIN_NAMESPACE
 
-static jclass g_qtMediaRecorderClass = 0;
+static jclass g_qtMediaRecorderListenerClass = 0;
 static QMap<jlong, JMediaRecorder*> g_objectMap;
 
 static void notifyError(JNIEnv* , jobject, jlong id, jint what, jint extra)
@@ -68,9 +68,17 @@ JMediaRecorder::JMediaRecorder()
     : QObject()
     , m_id(reinterpret_cast<jlong>(this))
 {
-    m_mediaRecorder = QJNIObjectPrivate(g_qtMediaRecorderClass, "(J)V", m_id);
-    if (m_mediaRecorder.isValid())
+    m_mediaRecorder = QJNIObjectPrivate("android/media/MediaRecorder");
+    if (m_mediaRecorder.isValid()) {
+        QJNIObjectPrivate listener(g_qtMediaRecorderListenerClass, "(J)V", m_id);
+        m_mediaRecorder.callMethod<void>("setOnErrorListener",
+                                         "(Landroid/media/MediaRecorder$OnErrorListener;)V",
+                                         listener.object());
+        m_mediaRecorder.callMethod<void>("setOnInfoListener",
+                                         "(Landroid/media/MediaRecorder$OnErrorListener;)V",
+                                         listener.object());
         g_objectMap.insert(m_id, this);
+    }
 }
 
 JMediaRecorder::~JMediaRecorder()
@@ -271,13 +279,13 @@ static JNINativeMethod methods[] = {
 
 bool JMediaRecorder::initJNI(JNIEnv *env)
 {
-    jclass clazz = env->FindClass("org/qtproject/qt5/android/multimedia/QtMediaRecorder");
+    jclass clazz = env->FindClass("org/qtproject/qt5/android/multimedia/QtMediaRecorderListener");
     if (env->ExceptionCheck())
         env->ExceptionClear();
 
     if (clazz) {
-        g_qtMediaRecorderClass = static_cast<jclass>(env->NewGlobalRef(clazz));
-        if (env->RegisterNatives(g_qtMediaRecorderClass,
+        g_qtMediaRecorderListenerClass = static_cast<jclass>(env->NewGlobalRef(clazz));
+        if (env->RegisterNatives(g_qtMediaRecorderListenerClass,
                                  methods,
                                  sizeof(methods) / sizeof(methods[0])) < 0) {
             return false;