Merge "Updated android.graphics.SurfaceTexture to use wp for FrameAvailableListener"
diff --git a/core/jni/android/graphics/SurfaceTexture.cpp b/core/jni/android/graphics/SurfaceTexture.cpp
index c48b974..842c557 100644
--- a/core/jni/android/graphics/SurfaceTexture.cpp
+++ b/core/jni/android/graphics/SurfaceTexture.cpp
@@ -40,6 +40,7 @@
struct fields_t {
jfieldID surfaceTexture;
+ jfieldID frameAvailableListener;
jmethodID postEvent;
};
static fields_t fields;
@@ -60,11 +61,25 @@
env->SetIntField(thiz, fields.surfaceTexture, (int)surfaceTexture.get());
}
-sp<SurfaceTexture> SurfaceTexture_getSurfaceTexture(JNIEnv* env, jobject thiz)
+static void SurfaceTexture_setFrameAvailableListener(JNIEnv* env,
+ jobject thiz, sp<SurfaceTexture::FrameAvailableListener> listener)
{
- sp<SurfaceTexture> surfaceTexture(
- (SurfaceTexture*)env->GetIntField(thiz, fields.surfaceTexture));
- return surfaceTexture;
+ SurfaceTexture::FrameAvailableListener* const p =
+ (SurfaceTexture::FrameAvailableListener*)
+ env->GetIntField(thiz, fields.frameAvailableListener);
+ if (listener.get()) {
+ listener->incStrong(thiz);
+ }
+ if (p) {
+ p->decStrong(thiz);
+ }
+ env->SetIntField(thiz, fields.frameAvailableListener, (int)listener.get());
+}
+
+sp<SurfaceTexture> SurfaceTexture_getSurfaceTexture(JNIEnv* env,
+ jobject thiz)
+{
+ return (SurfaceTexture*)env->GetIntField(thiz, fields.surfaceTexture);
}
sp<ANativeWindow> android_SurfaceTexture_getNativeWindow(
@@ -168,6 +183,12 @@
ALOGE("can't find android/graphics/SurfaceTexture.%s",
ANDROID_GRAPHICS_SURFACETEXTURE_JNI_ID);
}
+ fields.frameAvailableListener = env->GetFieldID(clazz,
+ ANDROID_GRAPHICS_FRAMEAVAILABLELISTENER_JNI_ID, "I");
+ if (fields.frameAvailableListener == NULL) {
+ ALOGE("can't find android/graphics/SurfaceTexture.%s",
+ ANDROID_GRAPHICS_FRAMEAVAILABLELISTENER_JNI_ID);
+ }
fields.postEvent = env->GetStaticMethodID(clazz, "postEventFromNative",
"(Ljava/lang/Object;)V");
@@ -197,12 +218,14 @@
sp<JNISurfaceTextureContext> ctx(new JNISurfaceTextureContext(env, weakThiz,
clazz));
surfaceTexture->setFrameAvailableListener(ctx);
+ SurfaceTexture_setFrameAvailableListener(env, thiz, ctx);
}
static void SurfaceTexture_finalize(JNIEnv* env, jobject thiz)
{
sp<SurfaceTexture> surfaceTexture(SurfaceTexture_getSurfaceTexture(env, thiz));
surfaceTexture->setFrameAvailableListener(0);
+ SurfaceTexture_setFrameAvailableListener(env, thiz, 0);
SurfaceTexture_setSurfaceTexture(env, thiz, 0);
}
diff --git a/core/jni/android_hardware_Camera.cpp b/core/jni/android_hardware_Camera.cpp
index 67d831c..d39f565c 100644
--- a/core/jni/android_hardware_Camera.cpp
+++ b/core/jni/android_hardware_Camera.cpp
@@ -22,6 +22,7 @@
#include "jni.h"
#include "JNIHelp.h"
#include "android_runtime/AndroidRuntime.h"
+#include <android_runtime/android_graphics_SurfaceTexture.h>
#include <cutils/properties.h>
#include <utils/Vector.h>
@@ -36,7 +37,6 @@
struct fields_t {
jfieldID context;
jfieldID surface;
- jfieldID surfaceTexture;
jfieldID facing;
jfieldID orientation;
jfieldID canDisableShutterSound;
@@ -555,8 +555,8 @@
sp<BufferQueue> bufferQueue = NULL;
if (jSurfaceTexture != NULL) {
- sp<SurfaceTexture> surfaceTexture = reinterpret_cast<SurfaceTexture*>(env->GetIntField(
- jSurfaceTexture, fields.surfaceTexture));
+ sp<SurfaceTexture> surfaceTexture =
+ SurfaceTexture_getSurfaceTexture(env, jSurfaceTexture);
if (surfaceTexture != NULL) {
bufferQueue = surfaceTexture->getBufferQueue();
}
@@ -966,8 +966,6 @@
field fields_to_find[] = {
{ "android/hardware/Camera", "mNativeContext", "I", &fields.context },
{ "android/view/Surface", ANDROID_VIEW_SURFACE_JNI_ID, "I", &fields.surface },
- { "android/graphics/SurfaceTexture",
- ANDROID_GRAPHICS_SURFACETEXTURE_JNI_ID, "I", &fields.surfaceTexture },
{ "android/hardware/Camera$CameraInfo", "facing", "I", &fields.facing },
{ "android/hardware/Camera$CameraInfo", "orientation", "I", &fields.orientation },
{ "android/hardware/Camera$CameraInfo", "canDisableShutterSound", "Z",
diff --git a/graphics/java/android/graphics/SurfaceTexture.java b/graphics/java/android/graphics/SurfaceTexture.java
index 4beaecd..59f06dd 100644
--- a/graphics/java/android/graphics/SurfaceTexture.java
+++ b/graphics/java/android/graphics/SurfaceTexture.java
@@ -66,9 +66,10 @@
private OnFrameAvailableListener mOnFrameAvailableListener;
/**
- * This field is used by native code, do not access or modify.
+ * These fields are used by native code, do not access or modify.
*/
private int mSurfaceTexture;
+ private int mFrameAvailableListener;
/**
* Callback interface for being notified that a new stream frame is available.