mirror of https://github.com/kivy/pyjnius.git
120 lines
3.7 KiB
Python
120 lines
3.7 KiB
Python
from types import ClassType
|
|
from jnius import JavaClass, MetaJavaClass, JavaMethod, JavaStaticMethod, \
|
|
JavaField, JavaStaticField
|
|
|
|
class Class(JavaClass):
|
|
__metaclass__ = MetaJavaClass
|
|
__javaclass__ = 'java/lang/Class'
|
|
|
|
forName = JavaStaticMethod('(Ljava/lang/String;)Ljava/lang/Class;')
|
|
getDeclaredMethods = JavaMethod('()[Ljava/lang/reflect/Method;')
|
|
getDeclaredFields = JavaMethod('()[Ljava/lang/reflect/Field;')
|
|
getName = JavaMethod('()Ljava/lang/String;')
|
|
|
|
class Object(JavaClass):
|
|
__metaclass__ = MetaJavaClass
|
|
__javaclass__ = 'java/lang/Object'
|
|
|
|
getClass = JavaMethod('()Ljava/lang/Class;')
|
|
|
|
class Modifier(JavaClass):
|
|
__metaclass__ = MetaJavaClass
|
|
__javaclass__ = 'java/lang/reflect/Modifier'
|
|
|
|
isAbstract = JavaStaticMethod('(I)Z')
|
|
isFinal = JavaStaticMethod('(I)Z')
|
|
isInterface = JavaStaticMethod('(I)Z')
|
|
isNative = JavaStaticMethod('(I)Z')
|
|
isPrivate = JavaStaticMethod('(I)Z')
|
|
isProtected = JavaStaticMethod('(I)Z')
|
|
isPublic = JavaStaticMethod('(I)Z')
|
|
isStatic = JavaStaticMethod('(I)Z')
|
|
isStrict = JavaStaticMethod('(I)Z')
|
|
isSynchronized = JavaStaticMethod('(I)Z')
|
|
isTransient = JavaStaticMethod('(I)Z')
|
|
isVolatile = JavaStaticMethod('(I)Z')
|
|
|
|
class Method(JavaClass):
|
|
__metaclass__ = MetaJavaClass
|
|
__javaclass__ = 'java/lang/reflect/Method'
|
|
|
|
getName = JavaMethod('()Ljava/lang/String;')
|
|
toString = JavaMethod('()Ljava/lang/String;')
|
|
getParameterTypes = JavaMethod('()[Ljava/lang/Class;')
|
|
getReturnType = JavaMethod('()Ljava/lang/Class;')
|
|
getModifiers = JavaMethod('()I')
|
|
|
|
|
|
class Field(JavaClass):
|
|
__metaclass__ = MetaJavaClass
|
|
__javaclass__ = 'java/lang/reflect/Field'
|
|
|
|
getName = JavaMethod('()Ljava/lang/String;')
|
|
toString = JavaMethod('()Ljava/lang/String;')
|
|
getType = JavaMethod('()Ljava/lang/Class;')
|
|
getModifiers = JavaMethod('()I')
|
|
|
|
|
|
def get_signature(cls_tp):
|
|
tp = cls_tp.getName()
|
|
if tp[0] == '[':
|
|
return tp.replace('.', '/')
|
|
signatures = { 'void': 'V', 'boolean': 'Z', 'byte': 'B',
|
|
'char': 'C', 'short': 'S', 'int': 'I',
|
|
'long': 'J', 'float': 'F', 'double': 'D'}
|
|
ret = signatures.get(tp)
|
|
if ret:
|
|
return ret
|
|
# don't do it in recursive way for the moment,
|
|
# error on the JNI/android: JNI ERROR (app bug): local reference table overflow (max=512)
|
|
#
|
|
#ensureclass(tp)
|
|
return 'L{0};'.format(tp.replace('.', '/'))
|
|
|
|
|
|
registers = []
|
|
|
|
def ensureclass(clsname):
|
|
if clsname in registers:
|
|
return
|
|
jniname = clsname.replace('.', '/')
|
|
if MetaJavaClass.get_javaclass(jniname):
|
|
return
|
|
registers.append(clsname)
|
|
autoclass(clsname)
|
|
|
|
|
|
def autoclass(clsname):
|
|
jniname = clsname.replace('.', '/')
|
|
cls = MetaJavaClass.get_javaclass(jniname)
|
|
if cls: return cls
|
|
|
|
classDict = {}
|
|
|
|
c = Class.forName(clsname)
|
|
if c is None:
|
|
raise Exception('Java class {0} not found'.format(c))
|
|
return None
|
|
|
|
for method in c.getDeclaredMethods():
|
|
static = Modifier.isStatic(method.getModifiers())
|
|
sig = '({0}){1}'.format(
|
|
''.join([get_signature(x) for x in method.getParameterTypes()]),
|
|
get_signature(method.getReturnType()))
|
|
cls = JavaStaticMethod if static else JavaMethod
|
|
classDict[method.getName()] = cls(sig)
|
|
|
|
for field in c.getDeclaredFields():
|
|
static = Modifier.isStatic(field.getModifiers())
|
|
sig = get_signature(field.getType())
|
|
cls = JavaStaticField if static else JavaField
|
|
classDict[field.getName()] = cls(sig)
|
|
|
|
classDict['__javaclass__'] = clsname.replace('.', '/')
|
|
|
|
return MetaJavaClass.__new__(MetaJavaClass,
|
|
clsname,#.replace('.', '_'),
|
|
(JavaClass, ),
|
|
classDict)
|
|
|