Access Java classes from Python
Go to file
Benson Margulies 0ab1468bc5 Fix issue #162 by making 'make tests' pass. 2015-04-30 19:36:56 -04:00
docs pyjnius: document detach() function. Closes #97. Closes #107. 2015-02-07 20:07:56 +01:00
jnius Make lists work like Python list containers. 2015-04-30 16:24:27 -04:00
tests Fix issue #162 by making 'make tests' pass. 2015-04-30 19:36:56 -04: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 Fix issue #162 by making 'make tests' pass. 2015-04-30 19:36:56 -04: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 #149 from msmolens/osx-yosemite-build 2015-03-12 16:21:32 +01: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