[vlc-devel] [PATCH 05/14] android: utils: load Surface JNI API

Thomas Guillem thomas at gllm.fr
Mon Jun 15 13:18:16 CEST 2020



On Fri, Jun 12, 2020, at 11:40, Alexandre Janniaux wrote:
> When creating a SurfaceTexture JNI object, we can, with recent API,
> transform the SurfaceTexture into an ASurfaceTexture NDK object.
> However, with previous Android version, the only way is to create the
> Surface JNI object directly from the SurfaceTexture JNI object, and then
> convert the Surface into a ANativeWindow NDK object for the producer
> side.
> 
> This patch loads the class and the constructor taking a reference to
> SurfaceTexture.
> ---
>  modules/video_output/android/utils.c | 25 +++++++++++++++++++++++++
>  1 file changed, 25 insertions(+)
> 
> diff --git a/modules/video_output/android/utils.c 
> b/modules/video_output/android/utils.c
> index 7818f1e5e7b..92ed9aca1d2 100644
> --- a/modules/video_output/android/utils.c
> +++ b/modules/video_output/android/utils.c
> @@ -133,6 +133,10 @@ static struct
>            jmethodID init_iz;
>            jmethodID init_z;
>      } SurfaceTexture;
> +    struct {
> +        jclass clazz;
> +        jmethodID init_st;
> +    } Surface;
>  } jfields;
>  
>  #define JNI_CALL(what, obj, method, ...) \
> @@ -630,6 +634,7 @@ LoadNativeWindowAPI(AWindowHandler *p_awh, JNIEnv *p_env)
>          LoadNativeSurfaceAPI(p_awh);
>      }
>      jfields.SurfaceTexture.clazz = NULL;
> +    jfields.Surface.clazz = NULL;
>  
>      jclass surfacetexture_class = (*p_env)->FindClass(p_env,
>                                              "android/graphics/SurfaceTexture");
> @@ -656,11 +661,28 @@ LoadNativeWindowAPI(AWindowHandler *p_awh, JNIEnv *p_env)
>          !jfields.SurfaceTexture.init_z)
>          goto error;
>  
> +    jclass surface_class = (*p_env)->FindClass(p_env, 
> "android/view/Surface");
> +    if (surface_class == NULL)
> +        goto error;
> +
> +    jfields.Surface.clazz = (*p_env)->NewGlobalRef(p_env, 
> surface_class);
> +    (*p_env)->DeleteLocalRef(p_env, surface_class);
> +    if (jfields.Surface.clazz == NULL)

YOu also need to clear the exception when class load fails.

> +        goto error;
> +
> +    jfields.Surface.init_st = (*p_env)->GetMethodID(p_env,
> +                            jfields.Surface.clazz, "<init>", 
> "(Landroid/graphics/SurfaceTexture;)V");
> +    if (jfields.Surface.init_st == NULL)
> +        goto error;

Same thing here, use something like the GET_METHOD macro.

> +
>      return;
>  
>  error:
>      if (jfields.SurfaceTexture.clazz != NULL)
>          (*p_env)->DeleteGlobalRef(p_env, jfields.SurfaceTexture.clazz);
> +
> +    if (jfields.Surface.clazz != NULL)
> +        (*p_env)->DeleteGlobalRef(p_env, jfields.SurfaceTexture.clazz);
>  }
>  
>  static void
> @@ -871,6 +893,9 @@ AWindowHandler_destroy(AWindowHandler *p_awh)
>          if (jfields.SurfaceTexture.clazz)
>              (*p_env)->DeleteGlobalRef(p_env, jfields.SurfaceTexture.clazz);
>  
> +        if (jfields.Surface.clazz)
> +            (*p_env)->DeleteGlobalRef(p_env, jfields.Surface.clazz);
> +
>          JNI_ANWCALL(CallVoidMethod, unregisterNative);
>          AWindowHandler_releaseANativeWindowEnv(p_awh, p_env, 
> AWindow_Video);
>          AWindowHandler_releaseANativeWindowEnv(p_awh, p_env, 
> AWindow_Subtitles);
> -- 
> 2.27.0
> 
> _______________________________________________
> vlc-devel mailing list
> To unsubscribe or modify your subscription options:
> https://mailman.videolan.org/listinfo/vlc-devel


More information about the vlc-devel mailing list