mirror of https://github.com/kivy/pyjnius.git
add support for multiple signatures, add various tests
This commit is contained in:
parent
a2d0076e56
commit
208806f635
|
@ -1,22 +1,3 @@
|
||||||
cdef extern from "stdarg.h":
|
|
||||||
ctypedef struct va_list:
|
|
||||||
pass
|
|
||||||
ctypedef struct fake_type:
|
|
||||||
pass
|
|
||||||
void va_start(va_list, void* arg)
|
|
||||||
void* va_arg(va_list, fake_type)
|
|
||||||
void va_end(va_list)
|
|
||||||
fake_type bool_type "int"
|
|
||||||
fake_type byte_type "char" # can i really do this?
|
|
||||||
fake_type char_type "char"
|
|
||||||
fake_type int_type "int"
|
|
||||||
fake_type short_type "short"
|
|
||||||
fake_type long_type "long"
|
|
||||||
fake_type float_type "float"
|
|
||||||
fake_type double_type "double"
|
|
||||||
fake_type pointer_type "void*"
|
|
||||||
|
|
||||||
|
|
||||||
cdef parse_definition(definition):
|
cdef parse_definition(definition):
|
||||||
# not a function, just a field
|
# not a function, just a field
|
||||||
if definition[0] != '(':
|
if definition[0] != '(':
|
||||||
|
@ -241,15 +222,17 @@ cdef int calculate_score(sign_args, args, is_varargs=False) except *:
|
||||||
import functools
|
import functools
|
||||||
import traceback
|
import traceback
|
||||||
class java_implementation(object):
|
class java_implementation(object):
|
||||||
def __init__(self, signature):
|
def __init__(self, signature, name=None):
|
||||||
super(java_implementation, self).__init__()
|
super(java_implementation, self).__init__()
|
||||||
self.signature = signature
|
self.signature = signature
|
||||||
|
self.name = name
|
||||||
|
|
||||||
def __get__(self, instance, instancetype):
|
def __get__(self, instance, instancetype):
|
||||||
return functools.partial(self.__call__, instance)
|
return functools.partial(self.__call__, instance)
|
||||||
|
|
||||||
def __call__(self, f):
|
def __call__(self, f):
|
||||||
f.__javasignature__ = self.signature
|
f.__javasignature__ = self.signature
|
||||||
|
f.__javaname__ = self.name
|
||||||
return f
|
return f
|
||||||
|
|
||||||
cdef class PythonJavaClass(object):
|
cdef class PythonJavaClass(object):
|
||||||
|
@ -278,7 +261,7 @@ cdef class PythonJavaClass(object):
|
||||||
if not hasattr(attr, '__javasignature__'):
|
if not hasattr(attr, '__javasignature__'):
|
||||||
continue
|
continue
|
||||||
signature = parse_definition(attr.__javasignature__)
|
signature = parse_definition(attr.__javasignature__)
|
||||||
self.__javamethods__[(x, signature)] = attr
|
self.__javamethods__[(attr.__javaname__ or x, signature)] = attr
|
||||||
|
|
||||||
def invoke(self, method, *args):
|
def invoke(self, method, *args):
|
||||||
try:
|
try:
|
||||||
|
@ -420,12 +403,14 @@ def test():
|
||||||
print '1: declare a TestImplem that implement Collection'
|
print '1: declare a TestImplem that implement Collection'
|
||||||
|
|
||||||
class TestImplemIterator(PythonJavaClass):
|
class TestImplemIterator(PythonJavaClass):
|
||||||
__javainterfaces__ = ['java/util/Iterator']
|
__javainterfaces__ = [
|
||||||
|
#'java/util/Iterator',
|
||||||
|
'java/util/ListIterator',]
|
||||||
|
|
||||||
def __init__(self, collection):
|
def __init__(self, collection, index=0):
|
||||||
super(TestImplemIterator, self).__init__()
|
super(TestImplemIterator, self).__init__()
|
||||||
self.collection = collection
|
self.collection = collection
|
||||||
self.index = 0
|
self.index = index
|
||||||
|
|
||||||
@java_implementation('()Z')
|
@java_implementation('()Z')
|
||||||
def hasNext(self):
|
def hasNext(self):
|
||||||
|
@ -437,6 +422,21 @@ def test():
|
||||||
self.index += 1
|
self.index += 1
|
||||||
return obj
|
return obj
|
||||||
|
|
||||||
|
@java_implementation('()Z')
|
||||||
|
def hasPrevious(self):
|
||||||
|
return self.index >= 0
|
||||||
|
|
||||||
|
@java_implementation('()Ljava/lang/Object;')
|
||||||
|
def previous(self):
|
||||||
|
self.index -= 1
|
||||||
|
obj = self.collection.data[self.index]
|
||||||
|
print "previous called", obj
|
||||||
|
return obj
|
||||||
|
|
||||||
|
@java_implementation('()I')
|
||||||
|
def previousIndex(self):
|
||||||
|
return self.index - 1
|
||||||
|
|
||||||
@java_implementation('()Ljava/lang/String;')
|
@java_implementation('()Ljava/lang/String;')
|
||||||
def toString(self):
|
def toString(self):
|
||||||
return repr(self)
|
return repr(self)
|
||||||
|
@ -475,6 +475,18 @@ def test():
|
||||||
def toArray(self):
|
def toArray(self):
|
||||||
return self.data
|
return self.data
|
||||||
|
|
||||||
|
@java_implementation('()Ljava/util/ListIterator;')
|
||||||
|
def listIterator(self):
|
||||||
|
it = TestImplemIterator(self)
|
||||||
|
return it
|
||||||
|
|
||||||
|
@java_implementation('(I)Ljava/util/ListIterator;',
|
||||||
|
name='ListIterator')
|
||||||
|
def listIteratorI(self, index):
|
||||||
|
it = TestImplemIterator(self, index)
|
||||||
|
return it
|
||||||
|
|
||||||
|
|
||||||
print '2: instanciate the class, with some data'
|
print '2: instanciate the class, with some data'
|
||||||
a = TestImplem(*range(10))
|
a = TestImplem(*range(10))
|
||||||
print a
|
print a
|
||||||
|
@ -490,6 +502,21 @@ def test():
|
||||||
ret = Collections.max(a)
|
ret = Collections.max(a)
|
||||||
print 'MAX returned', ret
|
print 'MAX returned', ret
|
||||||
|
|
||||||
|
# the first one of the following methods will work, witchever it is
|
||||||
|
# the next ones will fail
|
||||||
|
print "reverse"
|
||||||
|
print Collections.reverse(a)
|
||||||
|
print a.data
|
||||||
|
|
||||||
|
print "before swap"
|
||||||
|
print Collections.swap(a, 2, 3)
|
||||||
|
print "after swap"
|
||||||
|
print a.data
|
||||||
|
|
||||||
|
print "rotate"
|
||||||
|
print Collections.rotate(a, 5)
|
||||||
|
print a.data
|
||||||
|
|
||||||
print 'Order of data before shuffle()', a.data
|
print 'Order of data before shuffle()', a.data
|
||||||
print Collections.shuffle(a)
|
print Collections.shuffle(a)
|
||||||
print 'Order of data after shuffle()', a.data
|
print 'Order of data after shuffle()', a.data
|
||||||
|
|
Loading…
Reference in New Issue