diff options
Diffstat (limited to 'core')
-rw-r--r-- | core/jni/android/graphics/SurfaceTexture.cpp | 31 | ||||
-rw-r--r-- | core/jni/android_hardware_Camera.cpp | 8 |
2 files changed, 30 insertions, 9 deletions
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 @@ const char* const kSurfaceTextureClassPathName = "android/graphics/SurfaceTextur struct fields_t { jfieldID surfaceTexture; + jfieldID frameAvailableListener; jmethodID postEvent; }; static fields_t fields; @@ -60,11 +61,25 @@ static void SurfaceTexture_setSurfaceTexture(JNIEnv* env, jobject thiz, 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 @@ static void SurfaceTexture_classInit(JNIEnv* env, jclass clazz) 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 @@ static void SurfaceTexture_init(JNIEnv* env, jobject thiz, jint texName, 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 @@ using namespace android; struct fields_t { jfieldID context; jfieldID surface; - jfieldID surfaceTexture; jfieldID facing; jfieldID orientation; jfieldID canDisableShutterSound; @@ -555,8 +555,8 @@ static void android_hardware_Camera_setPreviewTexture(JNIEnv *env, 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 @@ int register_android_hardware_Camera(JNIEnv *env) 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", |