On Fri, Mar 11, 2016 at 09:36:41PM +0100, Matthieu Bouron wrote:
> From: Matthieu Bouron <matthieu.bou...@stupeflix.com>
> 
> Android N will prevent users from loading non-public APIs.
> 
> Users should only rely on the av_jni_set_java_vm function to set the
> Java VM.
> ---
>  libavcodec/ffjni.c | 88 
> ++----------------------------------------------------
>  1 file changed, 3 insertions(+), 85 deletions(-)
> 
> diff --git a/libavcodec/ffjni.c b/libavcodec/ffjni.c
> index da13699..54f3122 100644
> --- a/libavcodec/ffjni.c
> +++ b/libavcodec/ffjni.c
> @@ -35,80 +35,6 @@
>  static JavaVM *java_vm = NULL;
>  static pthread_mutex_t lock = PTHREAD_MUTEX_INITIALIZER;
>  
> -/**
> - * Check if JniInvocation has been initialized. Only available on
> - * Android >= 4.4.
> - *
> - * @param log_ctx context used for logging, can be NULL
> - * @return 0 on success, < 0 otherwise
> - */
> -static int check_jni_invocation(void *log_ctx)
> -{
> -    int ret = AVERROR_EXTERNAL;
> -    void *handle = NULL;
> -    void **jni_invocation = NULL;
> -
> -    handle = dlopen(NULL, RTLD_LOCAL);
> -    if (!handle) {
> -        goto done;
> -    }
> -
> -    jni_invocation = (void **)dlsym(handle, 
> "_ZN13JniInvocation15jni_invocation_E");
> -    if (!jni_invocation) {
> -        av_log(log_ctx, AV_LOG_ERROR, "Could not find 
> JniInvocation::jni_invocation_ symbol\n");
> -        goto done;
> -    }
> -
> -    ret = !(jni_invocation != NULL && *jni_invocation != NULL);
> -
> -done:
> -    if (handle) {
> -        dlclose(handle);
> -    }
> -
> -    return ret;
> -}
> -
> -/**
> - * Return created Java virtual machine using private JNI_GetCreatedJavaVMs
> - * function from the specified library name.
> - *
> - * @param name library name used for symbol lookups, can be NULL
> - * @param log_ctx context used for logging, can be NULL
> - * @return the current Java virtual machine in use
> - */
> -static JavaVM *get_java_vm(const char *name, void *log_ctx)
> -{
> -    JavaVM *vm = NULL;
> -    jsize nb_vm = 0;
> -
> -    void *handle = NULL;
> -    jint (*get_created_java_vms) (JavaVM ** vmBuf, jsize bufLen, jsize 
> *nVMs) = NULL;
> -
> -    handle = dlopen(name, RTLD_LOCAL);
> -    if (!handle) {
> -        return NULL;
> -    }
> -
> -    get_created_java_vms = (jint (*)(JavaVM **, jsize, jsize *)) 
> dlsym(handle, "JNI_GetCreatedJavaVMs");
> -    if (!get_created_java_vms) {
> -        av_log(log_ctx, AV_LOG_ERROR, "Could not find JNI_GetCreatedJavaVMs 
> symbol in library '%s'\n", name);
> -        goto done;
> -    }
> -
> -    if (get_created_java_vms(&vm, 1, &nb_vm) != JNI_OK) {
> -        av_log(log_ctx, AV_LOG_ERROR, "Could not get created Java virtual 
> machines\n");
> -        goto done;
> -    }
> -
> -done:
> -    if (handle) {
> -        dlclose(handle);
> -    }
> -
> -    return vm;
> -}
> -
>  JNIEnv *ff_jni_attach_env(int *attached, void *log_ctx)
>  {
>      int ret = 0;
> @@ -117,21 +43,13 @@ JNIEnv *ff_jni_attach_env(int *attached, void *log_ctx)
>      *attached = 0;
>  
>      pthread_mutex_lock(&lock);
> -    if (java_vm == NULL && (java_vm = av_jni_get_java_vm(log_ctx)) == NULL) {
> -
> -        av_log(log_ctx, AV_LOG_INFO, "Retrieving current Java virtual 
> machine using Android JniInvocation wrapper\n");
> -        if (check_jni_invocation(log_ctx) == 0) {
> -            if ((java_vm = get_java_vm(NULL, log_ctx)) != NULL ||
> -                (java_vm = get_java_vm("libdvm.so", log_ctx)) != NULL ||
> -                (java_vm = get_java_vm("libart.so", log_ctx)) != NULL) {
> -                av_log(log_ctx, AV_LOG_INFO, "Found Java virtual machine 
> using Android JniInvocation wrapper\n");
> -            }
> -        }
> +    if (java_vm == NULL) {
> +        java_vm = av_jni_get_java_vm(log_ctx);
>      }
>      pthread_mutex_unlock(&lock);
>  
>      if (!java_vm) {
> -        av_log(log_ctx, AV_LOG_ERROR, "Could not retrieve a Java virtual 
> machine\n");
> +        av_log(log_ctx, AV_LOG_ERROR, "No Java virtual machine has been 
> registered\n");
>          return NULL;
>      }
>  

If nobody objects, I will push the patch (with #include <dlfcn.h> removed)
tomorrow.

Matthieu
_______________________________________________
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
http://ffmpeg.org/mailman/listinfo/ffmpeg-devel

Reply via email to