summaryrefslogtreecommitdiffstats
path: root/src/plugins/android/src/wrappers/jsurfacetexture.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/plugins/android/src/wrappers/jsurfacetexture.cpp')
-rw-r--r--src/plugins/android/src/wrappers/jsurfacetexture.cpp83
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;
}
}