From: Matthieu Bouron <matthieu.bou...@stupeflix.com> --- configure | 4 +++ libavutil/Makefile | 4 +++ libavutil/jni.c | 37 ++++++++++++++++++++++++++ libavutil/jni.h | 42 +++++++++++++++++++++++++++++ libavutil/jni_internal.c | 69 ++++++++++++++++++++++++++++++++++++++++++++++++ libavutil/jni_internal.h | 42 +++++++++++++++++++++++++++++ 6 files changed, 198 insertions(+) create mode 100644 libavutil/jni.c create mode 100644 libavutil/jni.h create mode 100644 libavutil/jni_internal.c create mode 100644 libavutil/jni_internal.h
diff --git a/configure b/configure index dba7d46..de5b905 100755 --- a/configure +++ b/configure @@ -202,6 +202,7 @@ External library support: --enable-gnutls enable gnutls, needed for https support if openssl is not used [no] --disable-iconv disable iconv [autodetect] + --enable-jni enable JNI support [no] --enable-ladspa enable LADSPA audio filtering [no] --enable-libaacplus enable AAC+ encoding via libaacplus [no] --enable-libass enable libass subtitles rendering, @@ -1374,6 +1375,7 @@ EXTERNAL_LIBRARY_LIST=" frei0r gnutls iconv + jni ladspa libaacplus libass @@ -5263,6 +5265,7 @@ enabled chromaprint && require chromaprint chromaprint.h chromaprint_get_v enabled decklink && { check_header DeckLinkAPI.h || die "ERROR: DeckLinkAPI.h header not found"; } enabled frei0r && { check_header frei0r.h || die "ERROR: frei0r.h header not found"; } enabled gnutls && require_pkg_config gnutls gnutls/gnutls.h gnutls_global_init +enabled jni && { check_header jni.h; } enabled ladspa && { check_header ladspa.h || die "ERROR: ladspa.h header not found"; } enabled libiec61883 && require libiec61883 libiec61883/iec61883.h iec61883_cmp_connect -lraw1394 -lavc1394 -lrom1394 -liec61883 enabled libaacplus && require "libaacplus >= 2.0.0" aacplus.h aacplusEncOpen -laacplus @@ -6000,6 +6003,7 @@ echo "threading support ${thread_type-no}" echo "safe bitstream reader ${safe_bitstream_reader-no}" echo "SDL support ${sdl-no}" echo "opencl enabled ${opencl-no}" +echo "JNI support ${jni-no}" echo "texi2html enabled ${texi2html-no}" echo "perl enabled ${perl-no}" echo "pod2man enabled ${pod2man-no}" diff --git a/libavutil/Makefile b/libavutil/Makefile index 7439750..f7386c6 100644 --- a/libavutil/Makefile +++ b/libavutil/Makefile @@ -67,6 +67,8 @@ HEADERS-$(CONFIG_LZO) += lzo.h HEADERS-$(CONFIG_OPENCL) += opencl.h +HEADERS-$(CONFIG_JNI) += jni.h + ARCH_HEADERS = bswap.h \ intmath.h \ intreadwrite.h \ @@ -140,6 +142,7 @@ OBJS-$(!HAVE_ATOMICS_NATIVE) += atomic.o \ OBJS-$(CONFIG_LZO) += lzo.o OBJS-$(CONFIG_OPENCL) += opencl.o opencl_internal.o +OBJS-$(CONFIG_JNI) += jni.o jni_internal.o OBJS += $(COMPAT_OBJS:%=../compat/%) @@ -150,6 +153,7 @@ SKIPHEADERS-$(HAVE_ATOMICS_GCC) += atomic_gcc.h SKIPHEADERS-$(HAVE_ATOMICS_SUNCC) += atomic_suncc.h SKIPHEADERS-$(HAVE_ATOMICS_WIN32) += atomic_win32.h SKIPHEADERS-$(CONFIG_OPENCL) += opencl.h +SKIPHEADERS-$(CONFIG_JNI) += jni_internal.h TESTPROGS = adler32 \ aes \ diff --git a/libavutil/jni.c b/libavutil/jni.c new file mode 100644 index 0000000..c6ce3a5 --- /dev/null +++ b/libavutil/jni.c @@ -0,0 +1,37 @@ +/* + * Copyright (c) Stupeflix 2015 + * + * This file is part of FFmpeg. + * + * FFmpeg is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * FFmpeg is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with FFmpeg; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#include "config.h" +#include "jni.h" +#include "log.h" + +#include <stdlib.h> + +JavaVM *java_vm = NULL; + +void av_jni_register_java_vm(JavaVM *vm) +{ + java_vm = vm; +} + +JavaVM *av_jni_get_java_vm(void) +{ + return java_vm; +} diff --git a/libavutil/jni.h b/libavutil/jni.h new file mode 100644 index 0000000..3c36eaf --- /dev/null +++ b/libavutil/jni.h @@ -0,0 +1,42 @@ +/* + * Copyright (c) Stupeflix 2015 + * + * This file is part of FFmpeg. + * + * FFmpeg is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * FFmpeg is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with FFmpeg; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#ifndef AVUTIL_JNI_H +#define AVUTIL_JNI_H + +#include <jni.h> + +/* + * Register a java virtual machine that will be used to manage the JNI + * environment. + * + * @param vm java virtual machine + */ +void av_jni_register_java_vm(JavaVM *vm); + +/* + * Get the registered java virtual machine. + * + * @return the java virtual machine, NULL if no java virtual machine has been + * registered + */ +JavaVM *av_jni_get_java_vm(void); + +#endif /* AVUTIL_JNI_H */ diff --git a/libavutil/jni_internal.c b/libavutil/jni_internal.c new file mode 100644 index 0000000..b17275d --- /dev/null +++ b/libavutil/jni_internal.c @@ -0,0 +1,69 @@ +/* + * Copyright (c) Stupeflix 2015 + * + * This file is part of FFmpeg. + * + * FFmpeg is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * FFmpeg is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with FFmpeg; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#include "config.h" +#include "jni.h" +#include "jni_internal.h" +#include "log.h" + +#include <stdlib.h> + +extern JavaVM *java_vm; + +JNIEnv *avpriv_jni_attach_env(void *log_ctx) +{ + int ret = 0; + JNIEnv *env = NULL; + + if (java_vm == NULL) { + av_log(log_ctx, AV_LOG_ERROR, "No java virtual machine has been registered\n"); + return NULL; + } + + ret = (*java_vm)->GetEnv(java_vm, (void **)&env, JNI_VERSION_1_6); + switch(ret) { + case JNI_EDETACHED: + if ((*java_vm)->AttachCurrentThread(java_vm, &env, NULL) != 0) { + av_log(log_ctx, AV_LOG_ERROR, "Failed to attach the JNI environment to the current thread\n"); + env = NULL; + } + break; + case JNI_OK: + break; + case JNI_EVERSION: + av_log(log_ctx, AV_LOG_ERROR, "The specified JNI version is not supported\n"); + break; + default: + av_log(log_ctx, AV_LOG_ERROR, "Failed to get the JNI environment attached to this thread"); + break; + } + + return env; +} + +int avpriv_jni_detach_env(void *log_ctx) +{ + if (java_vm == NULL) { + av_log(log_ctx, AV_LOG_ERROR, "No java virtual machine has been registered\n"); + return AVERROR(EINVAL); + } + + return (*java_vm)->DetachCurrentThread(java_vm); +} diff --git a/libavutil/jni_internal.h b/libavutil/jni_internal.h new file mode 100644 index 0000000..6fc1fa6 --- /dev/null +++ b/libavutil/jni_internal.h @@ -0,0 +1,42 @@ +/* + * Copyright (c) Stupeflix 2015 + * + * This file is part of FFmpeg. + * + * FFmpeg is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * FFmpeg is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with FFmpeg; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#ifndef AVUTIL_JNI_INTERNAL_H +#define AVUTIL_JNI_INTERNAL_H + +#include <jni.h> + +/* + * Attach a JNI environment to the current thread. + * + * @param log_ctx context used for logging, can be NULL + * @return the JNI environment on success, NULL otherwise + */ +JNIEnv *avpriv_jni_attach_env(void *log_ctx); + +/* + * Detach the JNI environment from the current thread. + * + * @param log_ctx context used for logging, can be NULL + * @return 0 on success, < 0 otherwise + */ +int avpriv_jni_detach_env(void *log_ctx); + +#endif /* AVUTIL_JNI_INTERNAL_H */ -- 2.6.1 _______________________________________________ ffmpeg-devel mailing list ffmpeg-devel@ffmpeg.org http://ffmpeg.org/mailman/listinfo/ffmpeg-devel