Android: Fix QtMediaRecorder

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>
This commit is contained in:
Christian Strømme
2014-04-07 15:09:00 +02:00
committed by The Qt Project
parent a8854cc549
commit 6fb0d97838
3 changed files with 17 additions and 12 deletions

View 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

View File

@@ -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

View 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;