summaryrefslogtreecommitdiffstatshomepage
path: root/unix/modjni.c
diff options
context:
space:
mode:
authorPaul Sokolovsky <pfalcon@users.sourceforge.net>2015-09-17 13:31:16 +0300
committerPaul Sokolovsky <pfalcon@users.sourceforge.net>2015-09-17 13:31:40 +0300
commit1cb5de2cd5d563b6757ea8a683103daa3155083f (patch)
tree8a343adffc4107b48f1062ed99bf14d850a1f4ca /unix/modjni.c
parent861fad581975640dc943990ee889f3dc7cd8eb5d (diff)
downloadmicropython-1cb5de2cd5d563b6757ea8a683103daa3155083f.tar.gz
micropython-1cb5de2cd5d563b6757ea8a683103daa3155083f.zip
unix/modjni: jvalue2py: Handle class-containing jvalues.
Diffstat (limited to 'unix/modjni.c')
-rw-r--r--unix/modjni.c18
1 files changed, 14 insertions, 4 deletions
diff --git a/unix/modjni.c b/unix/modjni.c
index 5fc4dca356..001fa097ab 100644
--- a/unix/modjni.c
+++ b/unix/modjni.c
@@ -40,6 +40,7 @@
static JavaVM *jvm;
static JNIEnv *env;
+static jclass Class_class;
static jclass String_class;
static jmethodID Class_getField_mid;
static jmethodID Class_getMethods_mid;
@@ -51,6 +52,7 @@ STATIC const mp_obj_type_t jobject_type;
STATIC const mp_obj_type_t jmethod_type;
STATIC mp_obj_t new_jobject(jobject jo);
+STATIC mp_obj_t new_jclass(jclass jc);
STATIC mp_obj_t call_method(jobject obj, const char *name, jarray methods, bool is_constr, mp_uint_t n_args, const mp_obj_t *args);
typedef struct _mp_obj_jclass_t {
@@ -134,6 +136,12 @@ STATIC const mp_obj_type_t jclass_type = {
.locals_dict = (mp_obj_t)&jclass_locals_dict,
};
+STATIC mp_obj_t new_jclass(jclass jc) {
+ mp_obj_jclass_t *o = m_new_obj(mp_obj_jclass_t);
+ o->base.type = &jclass_type;
+ o->cls = jc;
+ return o;
+}
// jobject
@@ -243,6 +251,8 @@ ret_string:;
// Non-primitive, object type
if (JJ(IsInstanceOf, arg, String_class)) {
goto ret_string;
+ } else if (JJ(IsInstanceOf, arg, Class_class)) {
+ return new_jclass(arg);
} else {
return new_jobject(arg);
}
@@ -379,15 +389,15 @@ STATIC void create_jvm() {
nlr_raise(mp_obj_new_exception_msg_varg(&mp_type_OSError, "unable to create JVM"));
}
- jclass class_class = JJ(FindClass, "java/lang/Class");
+ Class_class = JJ(FindClass, "java/lang/Class");
jclass method_class = JJ(FindClass, "java/lang/reflect/Method");
String_class = JJ(FindClass, "java/lang/String");
- Class_getField_mid = (*env)->GetMethodID(env, class_class, "getField",
+ Class_getField_mid = (*env)->GetMethodID(env, Class_class, "getField",
"(Ljava/lang/String;)Ljava/lang/reflect/Field;");
- Class_getMethods_mid = (*env)->GetMethodID(env, class_class, "getMethods",
+ Class_getMethods_mid = (*env)->GetMethodID(env, Class_class, "getMethods",
"()[Ljava/lang/reflect/Method;");
- Class_getConstructors_mid = (*env)->GetMethodID(env, class_class, "getConstructors",
+ Class_getConstructors_mid = (*env)->GetMethodID(env, Class_class, "getConstructors",
"()[Ljava/lang/reflect/Constructor;");
Method_getName_mid = (*env)->GetMethodID(env, method_class, "getName",
"()Ljava/lang/String;");