diff options
Diffstat (limited to 'src/plugins/android/src/wrappers/jsurfacetexture.cpp')
-rw-r--r-- | src/plugins/android/src/wrappers/jsurfacetexture.cpp | 83 |
1 files changed, 59 insertions, 24 deletions
diff --git a/src/plugins/android/src/wrappers/jsurfacetexture.cpp b/src/plugins/android/src/wrappers/jsurfacetexture.cpp index 47487f104..2b16ebd66 100644 --- a/src/plugins/android/src/wrappers/jsurfacetexture.cpp +++ b/src/plugins/android/src/wrappers/jsurfacetexture.cpp @@ -41,10 +41,11 @@ #include "jsurfacetexture.h" #include <QtCore/private/qjni_p.h> +#include <QtCore/private/qjnihelpers_p.h> QT_BEGIN_NAMESPACE -static jclass g_qtSurfaceTextureClass = 0; +static jclass g_qtSurfaceTextureListenerClass = 0; static QMap<int, JSurfaceTexture*> g_objectMap; // native method for QtSurfaceTexture.java @@ -57,37 +58,75 @@ static void notifyFrameAvailable(JNIEnv* , jobject, int id) JSurfaceTexture::JSurfaceTexture(unsigned int texName) : QObject() - , QJNIObjectPrivate(g_qtSurfaceTextureClass, "(I)V", jint(texName)) , m_texID(int(texName)) { - if (isValid()) - g_objectMap.insert(int(texName), this); - else // If the class is not available, it means the Android version is < 3.0 + // API level 11 or higher is required + if (QtAndroidPrivate::androidSdkVersion() < 11) { qWarning("Camera preview and video playback require Android 3.0 (API level 11) or later."); + return; + } + + QJNIEnvironmentPrivate env; + m_surfaceTexture = QJNIObjectPrivate("android/graphics/SurfaceTexture", "(I)V", jint(texName)); + if (env->ExceptionCheck()) { +#ifdef QT_DEBUG + env->ExceptionDescribe(); +#endif // QT_DEBUG + env->ExceptionClear(); + } + + if (m_surfaceTexture.isValid()) + g_objectMap.insert(int(texName), this); + + QJNIObjectPrivate listener(g_qtSurfaceTextureListenerClass, "(I)V", jint(texName)); + m_surfaceTexture.callMethod<void>("setOnFrameAvailableListener", + "(Landroid/graphics/SurfaceTexture$OnFrameAvailableListener;)V", + listener.object()); } JSurfaceTexture::~JSurfaceTexture() { - if (isValid()) + if (m_surfaceTexture.isValid()) { + release(); g_objectMap.remove(m_texID); + } } QMatrix4x4 JSurfaceTexture::getTransformMatrix() { + QMatrix4x4 matrix; + if (!m_surfaceTexture.isValid()) + return matrix; + QJNIEnvironmentPrivate env; - QMatrix4x4 matrix; jfloatArray array = env->NewFloatArray(16); - callMethod<void>("getTransformMatrix", "([F)V", array); + m_surfaceTexture.callMethod<void>("getTransformMatrix", "([F)V", array); env->GetFloatArrayRegion(array, 0, 16, matrix.data()); env->DeleteLocalRef(array); return matrix; } +void JSurfaceTexture::release() +{ + if (QtAndroidPrivate::androidSdkVersion() < 14) + return; + + m_surfaceTexture.callMethod<void>("release"); +} + void JSurfaceTexture::updateTexImage() { - callMethod<void>("updateTexImage"); + if (!m_surfaceTexture.isValid()) + return; + + m_surfaceTexture.callMethod<void>("updateTexImage"); +} + +jobject JSurfaceTexture::object() +{ + return m_surfaceTexture.object(); } static JNINativeMethod methods[] = { @@ -96,24 +135,20 @@ static JNINativeMethod methods[] = { bool JSurfaceTexture::initJNI(JNIEnv *env) { - // SurfaceTexture is available since API 11, try to find it first before loading - // our custom class - jclass surfaceTextureClass = env->FindClass("android/graphics/SurfaceTexture"); + // SurfaceTexture is available since API 11. + if (QtAndroidPrivate::androidSdkVersion() < 11) + return false; + + jclass clazz = env->FindClass("org/qtproject/qt5/android/multimedia/QtSurfaceTextureListener"); if (env->ExceptionCheck()) env->ExceptionClear(); - if (surfaceTextureClass) { - jclass clazz = env->FindClass("org/qtproject/qt5/android/multimedia/QtSurfaceTexture"); - if (env->ExceptionCheck()) - env->ExceptionClear(); - - if (clazz) { - g_qtSurfaceTextureClass = static_cast<jclass>(env->NewGlobalRef(clazz)); - if (env->RegisterNatives(g_qtSurfaceTextureClass, - methods, - sizeof(methods) / sizeof(methods[0])) < 0) { - return false; - } + if (clazz) { + g_qtSurfaceTextureListenerClass = static_cast<jclass>(env->NewGlobalRef(clazz)); + if (env->RegisterNatives(g_qtSurfaceTextureListenerClass, + methods, + sizeof(methods) / sizeof(methods[0])) < 0) { + return false; } } |