Merge branch 'master' of github.com:kivy/pyjnius

This commit is contained in:
gabriel.pettier 2012-08-18 19:35:26 +02:00
commit 6aa4760721
10 changed files with 234 additions and 11 deletions

View File

@ -5,4 +5,5 @@ build_ext:
tests: build_ext
cd tests && javac org/jnius/HelloWorld.java
cd tests && javac org/jnius/BasicsTest.java
cd tests && env PYTHONPATH=..:$(PYTHONPATH) nosetests -v

View File

@ -1,4 +1,2 @@
from .jnius import (JavaObject, JavaMethod, JavaStaticMethod,
JavaField, JavaStaticField, JavaClass, MetaJavaClass,
JavaException, cast)
from .jnius import *
from .reflect import *

View File

@ -86,7 +86,8 @@ Python::
'''
__all__ = ('JavaObject', 'JavaClass', 'JavaMethod', 'JavaStaticMethod',
'JavaField', 'JavaStaticField', 'MetaJavaClass', 'JavaException', 'cast')
'JavaField', 'JavaStaticField', 'MetaJavaClass', 'JavaException', 'cast',
'find_javaclass')
from libc.stdlib cimport malloc, free
@ -929,3 +930,19 @@ def cast(destclass, obj):
jc.instanciate_from(jobj.j_self)
return jc
def find_javaclass(bytes name):
from reflect import Class
cdef JavaClass cls
cdef jclass jc
cdef JNIEnv *j_env = get_jnienv()
name = name.replace('.', '/')
jc = j_env[0].FindClass(j_env, name)
if jc == NULL:
raise JavaException('Class not found {0!r}'.format(name))
cls = Class(noinstance=True)
cls.instanciate_from(create_local_ref(j_env, jc))
return cls

View File

@ -75,7 +75,7 @@ cdef convert_jarray_to_python(JNIEnv *j_env, definition, jobject j_object):
elif r == 'C':
j_chars = j_env[0].GetCharArrayElements(
j_env, j_object, &iscopy)
ret = [(<char>j_chars[i]) for i in range(array_size)]
ret = [chr(<char>j_chars[i]) for i in range(array_size)]
if iscopy:
j_env[0].ReleaseCharArrayElements(
j_env, j_object, j_chars, 0)

View File

@ -9,15 +9,27 @@ cdef extern from "jni.h":
jint version
jint nOptions
jboolean ignoreUnrecognized
JavaVMOption *options
ctypedef struct JavaVMOption:
char *optionString
void *extraInfo
cdef JNIEnv *default_env = NULL
cdef void create_jnienv():
cdef JavaVM* jvm
cdef JavaVMInitArgs args
cdef JavaVMOption options[1]
cdef bytes py_bytes
from os.path import realpath
py_bytes = <bytes>('-Djava.class.path={0}'.format(realpath('.')))
options[0].optionString = py_bytes
options[0].extraInfo = NULL
args.version = JNI_VERSION_1_4
args.nOptions = 0
args.options = options
args.nOptions = 1
args.ignoreUnrecognized = JNI_FALSE
JNI_CreateJavaVM(&jvm, <void **>&default_env, &args)

View File

@ -1,7 +1,7 @@
__all__ = ('autoclass', 'ensureclass')
from jnius import JavaClass, MetaJavaClass, JavaMethod, JavaStaticMethod, \
JavaField, JavaStaticField, JavaMethodMultiple
JavaField, JavaStaticField, JavaMethodMultiple, find_javaclass
class Class(JavaClass):
__metaclass__ = MetaJavaClass
@ -102,7 +102,8 @@ def autoclass(clsname):
classDict = {}
c = Class.forName(clsname)
#c = Class.forName(clsname)
c = find_javaclass(clsname)
if c is None:
raise Exception('Java class {0} not found'.format(c))
return None

View File

@ -0,0 +1,115 @@
package org.jnius;
import java.lang.String;
public class BasicsTest {
static public boolean methodStaticZ() { return true; };
static public byte methodStaticB() { return 127; };
static public char methodStaticC() { return 'k'; };
static public short methodStaticS() { return 32767; };
static public int methodStaticI() { return 2147483467; };
static public long methodStaticJ() { return 2147483467; };
static public float methodStaticF() { return 1.23456789f; };
static public double methodStaticD() { return 1.23456789; };
static public String methodStaticString() { return new String("helloworld"); }
public boolean methodZ() { return true; };
public byte methodB() { return 127; };
public char methodC() { return 'k'; };
public short methodS() { return 32767; };
public int methodI() { return 2147483467; };
public long methodJ() { return 2147483467; };
public float methodF() { return 1.23456789f; };
public double methodD() { return 1.23456789; };
public String methodString() { return new String("helloworld"); }
static public boolean fieldStaticZ = true;
static public byte fieldStaticB = 127;
static public char fieldStaticC = 'k';
static public short fieldStaticS = 32767;
static public int fieldStaticI = 2147483467;
static public long fieldStaticJ = 2147483467;
static public float fieldStaticF = 1.23456789f;
static public double fieldStaticD = 1.23456789;
static public String fieldStaticString = new String("helloworld");
public boolean fieldZ = true;
public byte fieldB = 127;
public char fieldC = 'k';
public short fieldS = 32767;
public int fieldI = 2147483467;
public long fieldJ = 2147483467;
public float fieldF = 1.23456789f;
public double fieldD = 1.23456789;
public String fieldString = new String("helloworld");
public boolean[] methodArrayZ() {
boolean[] x = new boolean[3];
x[0] = x[1] = x[2] = true;
return x;
};
public byte[] methodArrayB() {
byte[] x = new byte[3];
x[0] = x[1] = x[2] = 127;
return x;
};
public char[] methodArrayC() {
char[] x = new char[3];
x[0] = x[1] = x[2] = 'k';
return x;
};
public short[] methodArrayS() {
short[] x = new short[3];
x[0] = x[1] = x[2] = 32767;
return x;
};
public int[] methodArrayI() {
int[] x = new int[3];
x[0] = x[1] = x[2] = 2147483467;
return x;
};
public long[] methodArrayJ() {
long[] x = new long[3];
x[0] = x[1] = x[2] = 2147483467;
return x;
};
public float[] methodArrayF() {
float[] x = new float[3];
x[0] = x[1] = x[2] = 1.23456789f;
return x;
};
public double[] methodArrayD() {
double[] x = new double[3];
x[0] = x[1] = x[2] = 1.23456789;
return x;
};
public String[] methodArrayString() {
String[] x = new String[3];
x[0] = x[1] = x[2] = new String("helloworld");
return x;
};
public boolean methodParamsZBCSIJFD(boolean x1, byte x2, char x3, short x4,
int x5, long x6, float x7, double x8) {
// ADD float / double, but dunno how to do with approx
return (x1 == true && x2 == 127 && x3 == 'k' && x4 == 32767 &&
x5 == 2147483467 && x6 == 2147483467);
}
public boolean methodParamsString(String s) {
return (s.equals("helloworld"));
}
public boolean methodParamsArrayI(int[] x) {
if (x.length != 3)
return false;
return (x[0] == 1 && x[1] == 2 && x[2] == 3);
}
public boolean methodParamsArrayString(String[] x) {
if (x.length != 2)
return false;
return (x[0].equals("hello") && x[1].equals("world"));
}
}

79
tests/test_basics.py Normal file
View File

@ -0,0 +1,79 @@
import unittest
from jnius.reflect import autoclass
class BasicsTest(unittest.TestCase):
def test_static_methods(self):
Test = autoclass('org.jnius.BasicsTest')
self.assertEquals(Test.methodStaticZ(), True)
self.assertEquals(Test.methodStaticB(), 127)
self.assertEquals(Test.methodStaticC(), 'k')
self.assertEquals(Test.methodStaticS(), 32767)
self.assertEquals(Test.methodStaticI(), 2147483467)
self.assertEquals(Test.methodStaticJ(), 2147483467)
self.assertAlmostEquals(Test.methodStaticF(), 1.23456789)
self.assertEquals(Test.methodStaticD(), 1.23456789)
self.assertEquals(Test.methodStaticString(), 'helloworld')
def test_static_fields(self):
Test = autoclass('org.jnius.BasicsTest')
self.assertEquals(Test.fieldStaticZ, True)
self.assertEquals(Test.fieldStaticB, 127)
self.assertEquals(Test.fieldStaticC, 'k')
self.assertEquals(Test.fieldStaticS, 32767)
self.assertEquals(Test.fieldStaticI, 2147483467)
self.assertEquals(Test.fieldStaticJ, 2147483467)
self.assertAlmostEquals(Test.fieldStaticF, 1.23456789)
self.assertEquals(Test.fieldStaticD, 1.23456789)
self.assertEquals(Test.fieldStaticString, 'helloworld')
def test_instance_methods(self):
test = autoclass('org.jnius.BasicsTest')()
self.assertEquals(test.methodZ(), True)
self.assertEquals(test.methodB(), 127)
self.assertEquals(test.methodC(), 'k')
self.assertEquals(test.methodS(), 32767)
self.assertEquals(test.methodI(), 2147483467)
self.assertEquals(test.methodJ(), 2147483467)
self.assertAlmostEquals(test.methodF(), 1.23456789)
self.assertEquals(test.methodD(), 1.23456789)
self.assertEquals(test.methodString(), 'helloworld')
def test_instance_fields(self):
test = autoclass('org.jnius.BasicsTest')()
self.assertEquals(test.fieldZ, True)
self.assertEquals(test.fieldB, 127)
self.assertEquals(test.fieldC, 'k')
self.assertEquals(test.fieldS, 32767)
self.assertEquals(test.fieldI, 2147483467)
self.assertEquals(test.fieldJ, 2147483467)
self.assertAlmostEquals(test.fieldF, 1.23456789)
self.assertEquals(test.fieldD, 1.23456789)
self.assertEquals(test.fieldString, 'helloworld')
def test_instances_methods_array(self):
test = autoclass('org.jnius.BasicsTest')()
self.assertEquals(test.methodArrayZ(), [True] * 3)
self.assertEquals(test.methodArrayB(), [127] * 3)
self.assertEquals(test.methodArrayC(), ['k'] * 3)
self.assertEquals(test.methodArrayS(), [32767] * 3)
self.assertEquals(test.methodArrayI(), [2147483467] * 3)
self.assertEquals(test.methodArrayJ(), [2147483467] * 3)
ret = test.methodArrayF()
ref = [1.23456789] * 3
self.assertAlmostEquals(ret[0], ref[0])
self.assertAlmostEquals(ret[1], ref[1])
self.assertAlmostEquals(ret[2], ref[2])
self.assertEquals(test.methodArrayD(), [1.23456789] * 3)
self.assertEquals(test.methodArrayString(), ['helloworld'] * 3)
def test_instances_methods_params(self):
test = autoclass('org.jnius.BasicsTest')()
self.assertEquals(test.methodParamsZBCSIJFD(
True, 127, 'k', 32767, 2147483467, 2147483467, 1.23456789, 1.23456789), True)
self.assertEquals(test.methodParamsString('helloworld'), True)
self.assertEquals(test.methodParamsArrayI([1, 2, 3]), True)
self.assertEquals(test.methodParamsArrayString([
'hello', 'world']), True)

View File

@ -2,7 +2,7 @@ import unittest
from jnius.reflect import autoclass
from jnius import cast
class MultipleSignature(unittest.TestCase):
class MultipleSignatureTest(unittest.TestCase):
def test_multiple_constructors(self):
String = autoclass('java.lang.String')

View File

@ -3,7 +3,7 @@ from jnius import JavaClass, MetaJavaClass, JavaMethod
class HelloWorldTest(unittest.TestCase):
def test(self):
def test_helloworld(self):
class HelloWorld(JavaClass):
__metaclass__ = MetaJavaClass