[FFmpeg-devel] [PATCH 3/5] lavu/jni: let avpriv_init_jfields load application classes

Matthieu Bouron matthieu.bouron at gmail.com
Mon Feb 15 18:52:28 CET 2016


From: Matthieu Bouron <matthieu.bouron at stupeflix.com>

---
 libavutil/jni_internal.c | 25 +++++++++++++++++++++----
 libavutil/jni_internal.h |  1 +
 2 files changed, 22 insertions(+), 4 deletions(-)

diff --git a/libavutil/jni_internal.c b/libavutil/jni_internal.c
index 5e2f7c3..ff25214 100644
--- a/libavutil/jni_internal.c
+++ b/libavutil/jni_internal.c
@@ -276,14 +276,31 @@ int avpriv_jni_init_jfields(JNIEnv *env, void *jfields, const struct FFJniField
         int mandatory = jfields_mapping[i].mandatory;
         enum FFJniFieldType type = jfields_mapping[i].type;
 
-        if (type == FF_JNI_CLASS) {
+        if (type == FF_JNI_CLASS || type == FF_JNI_APPLICATION_CLASS) {
             jclass clazz;
 
             last_clazz = NULL;
 
-            clazz = (*env)->FindClass(env, jfields_mapping[i].name);
-            if ((ret = avpriv_jni_exception_check(env, mandatory, log_ctx)) < 0 && mandatory) {
-                goto done;
+            if  (application_class_loader && type == FF_JNI_APPLICATION_CLASS) {
+
+                jobject tmp = avpriv_jni_utf_chars_to_jstring(env, jfields_mapping[i].name, log_ctx);
+                if (!tmp) {
+                    ret = AVERROR_EXTERNAL;
+                    goto done;
+                }
+
+                clazz = (*env)->CallObjectMethod(env, application_class_loader, find_class_id, tmp);
+                if ((ret = avpriv_jni_exception_check(env, 1, log_ctx)) < 0 && mandatory) {
+                    goto done;
+                }
+
+                (*env)->DeleteLocalRef(env, tmp);
+
+            } else {
+                clazz = (*env)->FindClass(env, jfields_mapping[i].name);
+                if ((ret = avpriv_jni_exception_check(env, mandatory, log_ctx)) < 0 && mandatory) {
+                    goto done;
+                }
             }
 
             last_clazz = *(jclass*)((uint8_t*)jfields + jfields_mapping[i].offset) =
diff --git a/libavutil/jni_internal.h b/libavutil/jni_internal.h
index 4d86f02..f6d9791 100644
--- a/libavutil/jni_internal.h
+++ b/libavutil/jni_internal.h
@@ -91,6 +91,7 @@ int avpriv_jni_exception_check(JNIEnv *env, int log, void *log_ctx);
 enum FFJniFieldType {
 
     FF_JNI_CLASS,
+    FF_JNI_APPLICATION_CLASS,
     FF_JNI_FIELD,
     FF_JNI_STATIC_FIELD,
     FF_JNI_METHOD,
-- 
2.7.1



More information about the ffmpeg-devel mailing list