summaryrefslogtreecommitdiffstats
path: root/core
diff options
context:
space:
mode:
Diffstat (limited to 'core')
-rw-r--r--core/jni/android/graphics/SurfaceTexture.cpp124
1 files changed, 94 insertions, 30 deletions
diff --git a/core/jni/android/graphics/SurfaceTexture.cpp b/core/jni/android/graphics/SurfaceTexture.cpp
index c1229f3..88de94f 100644
--- a/core/jni/android/graphics/SurfaceTexture.cpp
+++ b/core/jni/android/graphics/SurfaceTexture.cpp
@@ -25,8 +25,8 @@
#include <utils/Log.h>
#include <utils/misc.h>
-#include "android/graphics/GraphicsJNI.h"
#include "jni.h"
+#include "JNIHelp.h"
// ----------------------------------------------------------------------------
@@ -35,57 +35,127 @@ namespace android {
static const char* const OutOfResourcesException =
"android/graphics/SurfaceTexture$OutOfResourcesException";
-struct st_t {
- jfieldID surfaceTexture;
+struct fields_t {
+ jfieldID surfaceTexture;
+ jmethodID postEvent;
};
-static st_t st;
+static fields_t fields;
// ----------------------------------------------------------------------------
-static void setSurfaceTexture(JNIEnv* env, jobject clazz,
+static void SurfaceTexture_setSurfaceTexture(JNIEnv* env, jobject thiz,
const sp<SurfaceTexture>& surfaceTexture)
{
SurfaceTexture* const p =
- (SurfaceTexture*)env->GetIntField(clazz, st.surfaceTexture);
+ (SurfaceTexture*)env->GetIntField(thiz, fields.surfaceTexture);
if (surfaceTexture.get()) {
- surfaceTexture->incStrong(clazz);
+ surfaceTexture->incStrong(thiz);
}
if (p) {
- p->decStrong(clazz);
+ p->decStrong(thiz);
}
- env->SetIntField(clazz, st.surfaceTexture, (int)surfaceTexture.get());
+ env->SetIntField(thiz, fields.surfaceTexture, (int)surfaceTexture.get());
}
-sp<SurfaceTexture> getSurfaceTexture(JNIEnv* env, jobject clazz)
+sp<SurfaceTexture> SurfaceTexture_getSurfaceTexture(JNIEnv* env, jobject thiz)
{
sp<SurfaceTexture> surfaceTexture(
- (SurfaceTexture*)env->GetIntField(clazz, st.surfaceTexture));
+ (SurfaceTexture*)env->GetIntField(thiz, fields.surfaceTexture));
return surfaceTexture;
}
// ----------------------------------------------------------------------------
-static void SurfaceTexture_init(JNIEnv* env, jobject clazz, jint texName)
+class JNISurfaceTextureContext : public SurfaceTexture::FrameAvailableListener
{
- sp<SurfaceTexture> surfaceTexture(new SurfaceTexture(texName));
+public:
+ JNISurfaceTextureContext(JNIEnv* env, jobject weakThiz, jclass clazz);
+ virtual ~JNISurfaceTextureContext();
+ virtual void onFrameAvailable();
+
+private:
+ jobject mWeakThiz;
+ jclass mClazz;
+};
+
+JNISurfaceTextureContext::JNISurfaceTextureContext(JNIEnv* env,
+ jobject weakThiz, jclass clazz) :
+ mWeakThiz(env->NewGlobalRef(weakThiz)),
+ mClazz((jclass)env->NewGlobalRef(clazz))
+{}
+
+JNISurfaceTextureContext::~JNISurfaceTextureContext()
+{
+ JNIEnv *env = AndroidRuntime::getJNIEnv();
+ env->DeleteGlobalRef(mWeakThiz);
+ env->DeleteGlobalRef(mClazz);
+}
+
+void JNISurfaceTextureContext::onFrameAvailable()
+{
+ JNIEnv *env = AndroidRuntime::getJNIEnv();
+ env->CallStaticVoidMethod(mClazz, fields.postEvent, mWeakThiz);
+}
+
+// ----------------------------------------------------------------------------
+
+static void SurfaceTexture_classInit(JNIEnv* env, jclass clazz)
+{
+ fields.surfaceTexture = env->GetFieldID(clazz,
+ ANDROID_GRAPHICS_SURFACETEXTURE_JNI_ID, "I");
+ if (fields.surfaceTexture == NULL) {
+ LOGE("can't find android/graphics/SurfaceTexture.%s",
+ ANDROID_GRAPHICS_SURFACETEXTURE_JNI_ID);
+ }
+
+ fields.postEvent = env->GetStaticMethodID(clazz, "postEventFromNative",
+ "(Ljava/lang/Object;)V");
+ if (fields.postEvent == NULL) {
+ LOGE("can't find android/graphics/SurfaceTexture.postEventFromNative");
+ }
+
+}
+static void SurfaceTexture_init(JNIEnv* env, jobject thiz, jint texName,
+ jobject weakThiz)
+{
+ sp<SurfaceTexture> surfaceTexture(new SurfaceTexture(texName));
if (surfaceTexture == 0) {
- doThrow(env, OutOfResourcesException);
+ jniThrowException(env, OutOfResourcesException,
+ "Unable to create native SurfaceTexture");
+ return;
+ }
+ SurfaceTexture_setSurfaceTexture(env, thiz, surfaceTexture);
+
+ jclass clazz = env->GetObjectClass(thiz);
+ if (clazz == NULL) {
+ jniThrowRuntimeException(env,
+ "Can't find android/graphics/SurfaceTexture");
return;
}
- setSurfaceTexture(env, clazz, surfaceTexture);
+
+ sp<JNISurfaceTextureContext> ctx(new JNISurfaceTextureContext(env, weakThiz,
+ clazz));
+ surfaceTexture->setFrameAvailableListener(ctx);
+}
+
+static void SurfaceTexture_finalize(JNIEnv* env, jobject thiz)
+{
+ sp<SurfaceTexture> surfaceTexture(SurfaceTexture_getSurfaceTexture(env, thiz));
+ surfaceTexture->setFrameAvailableListener(0);
+ SurfaceTexture_setSurfaceTexture(env, thiz, 0);
}
-static void SurfaceTexture_updateTexImage(JNIEnv* env, jobject clazz)
+static void SurfaceTexture_updateTexImage(JNIEnv* env, jobject thiz)
{
- sp<SurfaceTexture> surfaceTexture(getSurfaceTexture(env, clazz));
+ sp<SurfaceTexture> surfaceTexture(SurfaceTexture_getSurfaceTexture(env, thiz));
surfaceTexture->updateTexImage();
}
-static void SurfaceTexture_getTransformMatrix(JNIEnv* env, jobject clazz,
+static void SurfaceTexture_getTransformMatrix(JNIEnv* env, jobject thiz,
jfloatArray jmtx)
{
- sp<SurfaceTexture> surfaceTexture(getSurfaceTexture(env, clazz));
+ sp<SurfaceTexture> surfaceTexture(SurfaceTexture_getSurfaceTexture(env, thiz));
float* mtx = env->GetFloatArrayElements(jmtx, NULL);
surfaceTexture->getTransformMatrix(mtx);
env->ReleaseFloatArrayElements(jmtx, mtx, 0);
@@ -94,21 +164,15 @@ static void SurfaceTexture_getTransformMatrix(JNIEnv* env, jobject clazz,
// ----------------------------------------------------------------------------
const char* const kSurfaceTextureClassPathName = "android/graphics/SurfaceTexture";
-static void nativeClassInit(JNIEnv* env, jclass clazz);
static JNINativeMethod gSurfaceTextureMethods[] = {
- {"nativeClassInit", "()V", (void*)nativeClassInit },
- {"init", "(I)V", (void*)SurfaceTexture_init },
- {"updateTexImage", "()V", (void*)SurfaceTexture_updateTexImage },
- {"getTransformMatrixImpl", "([F)V", (void*)SurfaceTexture_getTransformMatrix },
+ {"nativeClassInit", "()V", (void*)SurfaceTexture_classInit },
+ {"nativeInit", "(ILjava/lang/Object;)V", (void*)SurfaceTexture_init },
+ {"nativeFinalize", "()V", (void*)SurfaceTexture_finalize },
+ {"nativeUpdateTexImage", "()V", (void*)SurfaceTexture_updateTexImage },
+ {"nativeGetTransformMatrix", "([F)V", (void*)SurfaceTexture_getTransformMatrix },
};
-static void nativeClassInit(JNIEnv* env, jclass clazz)
-{
- st.surfaceTexture = env->GetFieldID(clazz,
- ANDROID_GRAPHICS_SURFACETEXTURE_JNI_ID, "I");
-}
-
int register_android_graphics_SurfaceTexture(JNIEnv* env)
{
int err = 0;