pyjnius/README.md

114 lines
3.6 KiB
Markdown
Raw Normal View History

2012-08-14 01:42:43 +00:00
PyJNIus
=======
Python module to access Java class as Python class, using JNI.
(Work in progress.)
2012-08-14 16:34:40 +00:00
Quick overview
--------------
2012-08-14 16:34:40 +00:00
```python
>>> from jnius.reflect import autoclass
2012-08-14 16:34:40 +00:00
>>> 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
```
2012-08-14 21:28:26 +00:00
Usage on desktop
----------------
You need java JDK installed (openjdk will do), cython, and make to build it
make
That's it! you can run the tests with
make tests
To make sure everything is running right.
2012-08-14 16:34:40 +00:00
Usage with python-for-android
-----------------------------
2012-08-14 16:35:17 +00:00
* Get http://github.com/kivy/python-for-android
* Compile a distribution with `-m "pyjnius kivy"`
* Then, you can do this kind of things:
2012-08-14 16:34:40 +00:00
```python
from time import sleep
from jnius import autoclass
Hardware = autoclass('org.renpy.android.Hardware')
print 'DPI is', Hardware.getDPI()
Hardware.accelerometerEnable()
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]
2012-08-14 16:38:30 +00:00
```
Advanced example
----------------
When you use autoclass, it will discover all the methods and fields within the object, and resolve it.
2012-08-14 21:28:26 +00:00
For now, it can be better to declare and use only what you need.
2012-08-14 16:38:30 +00:00
The previous example can be done manually:
```python
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)
2012-08-14 21:28:26 +00:00
```