From 91f2168dd53bf13807a7191b92851bf74fed0920 Mon Sep 17 00:00:00 2001
From: Paul Sokolovsky <pfalcon@users.sourceforge.net>
Date: Fri, 23 Oct 2015 00:33:03 +0300
Subject: [PATCH] unix/modjni: Actually check argument type when doing method
 resolution.

This is required to properly select among overloaded methods. It however
relies on java.lang.Object-overloaded method to come last, which appears
to be the case for OpenJDK.
---
 unix/modjni.c | 10 +++++++++-
 1 file changed, 9 insertions(+), 1 deletion(-)

diff --git a/unix/modjni.c b/unix/modjni.c
index eeed389ba..27470ae02 100644
--- a/unix/modjni.c
+++ b/unix/modjni.c
@@ -361,8 +361,8 @@ STATIC bool py2jvalue(const char **jtypesig, mp_obj_t arg, jvalue *out) {
             return false;
         }
     } else if (type == &jobject_type) {
-        printf("TODO: Check java arg type!!\n");
         bool is_object = false;
+        const char *expected_type = arg_type;
         while (1) {
             if (isalpha(*arg_type)) {
             } else if (*arg_type == '.') {
@@ -376,6 +376,14 @@ STATIC bool py2jvalue(const char **jtypesig, mp_obj_t arg, jvalue *out) {
             return false;
         }
         mp_obj_jobject_t *jo = arg;
+        if (!MATCH(expected_type, "java.lang.Object")) {
+            char class_name[64];
+            get_jclass_name(jo->obj, class_name);
+            //printf("Arg class: %s\n", class_name);
+            if (strcmp(class_name, expected_type) != 0) {
+                return false;
+            }
+        }
         out->l = jo->obj;
     } else if (type == &mp_type_bool) {
         if (IMATCH(arg_type, "boolean")) {
-- 
GitLab