Access Java classes from Python
Go to file
Mathieu Virbel a0c9467d42 add native support for CharSequence. We supported String, but not the baseclass CharSequence. Both returns a python string, and a python string can be assigned to both. 2015-03-02 10:59:34 +01:00
docs pyjnius: document detach() function. Closes #97. Closes #107. 2015-02-07 20:07:56 +01:00
jnius add native support for CharSequence. We supported String, but not the baseclass CharSequence. Both returns a python string, and a python string can be assigned to both. 2015-03-02 10:59:34 +01:00
tests add few tests about bytearray filling. 2015-02-07 19:31:04 +01:00
.gitignore .gitignore: tighten ignore rules in jnius/ 2013-02-05 15:00:40 +05:30
.travis.yml add travis file 2012-11-06 19:49:29 +01:00
LICENSE Pyjnius is now under MIT license 2013-08-01 16:36:25 +02:00
MANIFEST.in ensure we raise the exception if cython is not installed on desktop 2012-08-21 01:19:43 +02:00
Makefile Add support for multidimensional arrays 2014-05-05 17:29:33 +10:00
README.md doc: revisions to README.md 2014-03-07 14:57:30 +02:00
jnius_config.py Add control of JVM startup options 2014-05-09 18:20:29 +10:00
setup.py Merge pull request #110 from abrasive/jvmoptions 2014-09-30 20:01:09 +02:00

README.md

PyJNIus

A Python module to access Java classes as Python classes using JNI.

PyJNIus is a "Work In Progress".

Quick overview

>>> from jnius import autoclass
>>> autoclass('java.lang.System').out.println('Hello world')
Hello world

>>> Stack = autoclass('java.util.Stack')
>>> stack = Stack()
>>> stack.push('hello')
>>> stack.push('world')
>>> print stack.pop()
world
>>> print stack.pop()
hello

Usage on desktop

You need a java JDK installed (OpenJDK will do), Cython and make to build it.

make

That's it! You can run the tests using

make tests

to ensure everything is running correctly.

Usage with python-for-android

from time import sleep
from jnius import autoclass

Hardware = autoclass('org.renpy.android.Hardware')
print 'DPI is', Hardware.getDPI()

Hardware.accelerometerEnable(True)
for x in xrange(20):
    print Hardware.accelerometerReading()
    sleep(.1)

It will output something like:

I/python  ( 5983): Android kivy bootstrap done. __name__ is __main__
I/python  ( 5983): Run user program, change dir and execute main.py
I/python  ( 5983): DPI is 160
I/python  ( 5983): [0.0, 0.0, 0.0]
I/python  ( 5983): [-0.0095768067985773087, 9.3852710723876953, 2.2218191623687744]
I/python  ( 5983): [-0.0095768067985773087, 9.3948478698730469, 2.2218191623687744]
I/python  ( 5983): [-0.0095768067985773087, 9.3948478698730469, 2.2026655673980713]
I/python  ( 5983): [-0.028730420395731926, 9.4044246673583984, 2.2122423648834229]
I/python  ( 5983): [-0.019153613597154617, 9.3852710723876953, 2.2026655673980713]
I/python  ( 5983): [-0.028730420395731926, 9.3852710723876953, 2.2122423648834229]
I/python  ( 5983): [-0.0095768067985773087, 9.3852710723876953, 2.1835119724273682]
I/python  ( 5983): [-0.0095768067985773087, 9.3756942749023438, 2.1835119724273682]
I/python  ( 5983): [0.019153613597154617, 9.3948478698730469, 2.2122423648834229]
I/python  ( 5983): [0.038307227194309235, 9.3852710723876953, 2.2218191623687744]
I/python  ( 5983): [-0.028730420395731926, 9.3948478698730469, 2.2026655673980713]
I/python  ( 5983): [-0.028730420395731926, 9.3852710723876953, 2.2122423648834229]
I/python  ( 5983): [-0.038307227194309235, 9.3756942749023438, 2.2026655673980713]
I/python  ( 5983): [0.3926490843296051, 9.3086557388305664, 1.3311761617660522]
I/python  ( 5983): [-0.10534487664699554, 9.4331550598144531, 2.1068975925445557]
I/python  ( 5983): [0.26815059781074524, 9.3469638824462891, 2.3463177680969238]
I/python  ( 5983): [-0.1149216815829277, 9.3852710723876953, 2.31758713722229]
I/python  ( 5983): [-0.038307227194309235, 9.41400146484375, 1.8674772977828979]
I/python  ( 5983): [0.13407529890537262, 9.4235782623291016, 2.2026655673980713]

Advanced example

When you use autoclass, it will discover all the methods and fields of the object and resolve them. For now, it is better to declare and use only what you need. The previous example can be done manually as follows:

from time import sleep
from java import MetaJavaClass, JavaClass, JavaMethod, JavaStaticMethod

class Hardware(JavaClass):
    __metaclass__ = MetaJavaClass
    __javaclass__ = 'org/renpy/android/Hardware'
    vibrate = JavaStaticMethod('(D)V')
    accelerometerEnable = JavaStaticMethod('(Z)V')
    accelerometerReading = JavaStaticMethod('()[F')
    getDPI = JavaStaticMethod('()I')
    
# use that new class!
print 'DPI is', Hardware.getDPI()

Hardware.accelerometerEnable()
for x in xrange(20):
    print Hardware.accelerometerReading()
    sleep(.1)

Support/Discussion

mailto:pyjnius-dev@googlegroups.com