fffjni.c (2664B)
1 /* 2 * JNI public API functions 3 * 4 * Copyright (c) 2015-2016 Matthieu Bouron <matthieu.bouron stupeflix.com> 5 * 6 * This file is part of FFmpeg. 7 * 8 * FFmpeg is free software; you can redistribute it and/or 9 * modify it under the terms of the GNU Lesser General Public 10 * License as published by the Free Software Foundation; either 11 * version 2.1 of the License, or (at your option) any later version. 12 * 13 * FFmpeg is distributed in the hope that it will be useful, 14 * but WITHOUT ANY WARRANTY; without even the implied warranty of 15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 16 * Lesser General Public License for more details. 17 * 18 * You should have received a copy of the GNU Lesser General Public 19 * License along with FFmpeg; if not, write to the Free Software 20 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA 21 */ 22 23 #include "config.h" 24 25 #include <stdlib.h> 26 27 #include "libavutil/error.h" 28 #include "jni.h" 29 30 #if CONFIG_JNI 31 #include <jni.h> 32 #include <pthread.h> 33 34 #include "libavutil/log.h" 35 #include "ffjni.h" 36 37 static void *java_vm; 38 static void *android_app_ctx; 39 static pthread_mutex_t lock = PTHREAD_MUTEX_INITIALIZER; 40 41 int av_jni_set_java_vm(void *vm, void *log_ctx) 42 { 43 int ret = 0; 44 45 pthread_mutex_lock(&lock); 46 if (java_vm == NULL) { 47 java_vm = vm; 48 } else if (java_vm != vm) { 49 ret = AVERROR(EINVAL); 50 av_log(log_ctx, AV_LOG_ERROR, "A Java virtual machine has already been set"); 51 } 52 pthread_mutex_unlock(&lock); 53 54 return ret; 55 } 56 57 void *av_jni_get_java_vm(void *log_ctx) 58 { 59 void *vm; 60 61 pthread_mutex_lock(&lock); 62 vm = java_vm; 63 pthread_mutex_unlock(&lock); 64 65 return vm; 66 } 67 68 #else 69 70 int av_jni_set_java_vm(void *vm, void *log_ctx) 71 { 72 return AVERROR(ENOSYS); 73 } 74 75 void *av_jni_get_java_vm(void *log_ctx) 76 { 77 return NULL; 78 } 79 80 #endif 81 82 #if defined(__ANDROID__) 83 84 int av_jni_set_android_app_ctx(void *app_ctx, void *log_ctx) 85 { 86 #if CONFIG_JNI 87 jobjectRefType type; 88 89 JNIEnv *env = ff_jni_get_env(log_ctx); 90 if (!env) 91 return AVERROR(EINVAL); 92 93 type = (*env)->GetObjectRefType(env, app_ctx); 94 if (type != JNIGlobalRefType) { 95 av_log(log_ctx, AV_LOG_ERROR, "Application context must be passed as a global reference"); 96 return AVERROR(EINVAL); 97 } 98 99 pthread_mutex_lock(&lock); 100 android_app_ctx = app_ctx; 101 pthread_mutex_unlock(&lock); 102 103 return 0; 104 #else 105 return AVERROR(ENOSYS); 106 #endif 107 } 108 109 void *av_jni_get_android_app_ctx(void) 110 { 111 #if CONFIG_JNI 112 void *ctx; 113 114 pthread_mutex_lock(&lock); 115 ctx = android_app_ctx; 116 pthread_mutex_unlock(&lock); 117 118 return ctx; 119 #else 120 return NULL; 121 #endif 122 } 123 124 #endif