• Stars
    star
    1,384
  • Rank 33,956 (Top 0.7 %)
  • Language
    Python
  • License
    MIT License
  • Created over 12 years ago
  • Updated 3 months ago

Reviews

There are no reviews yet. Be the first to send feedback to the community and the maintainers!

Repository Details

Access Java classes from Python

PyJNIus

A Python module to access Java classes as Python classes using the Java Native Interface (JNI). Warning: the pypi name is now pyjnius instead of jnius.

Tests Tests (x86) Builds PyPI Backers on Open Collective Sponsors on Open Collective

Installation

pip install pyjnius

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 with python-for-android

  • Get python-for-android
  • Compile a distribution with kivy (PyJNIus will be automatically added)

Then, you can do this kind of things:

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 class and resolve them. You may want to declare and use only what you need. The previous example can be done manually as follows:

from time import sleep
from jnius 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)

You can use the signatures method of JavaMethod and JavaMultipleMethod, to inspect the discovered signatures of a method of an object

>>> String = autoclass('java.lang.String')
>>> dir(String)
['CASE_INSENSITIVE_ORDER', '__class__', '__cls_storage', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__javaclass__', '__javaconstructor__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__pyx_vtable__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__setstate__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', 'charAt', 'checkBounds', 'clone', 'codePointAt', 'codePointBefore', 'codePointCount', 'compareTo', 'compareToIgnoreCase', 'concat', 'contains', 'contentEquals', 'copyValueOf', 'empty', 'endsWith', 'equals', 'equalsIgnoreCase', 'finalize', 'format', 'getBytes', 'getChars', 'getClass', 'hashCode', 'indexOf', 'indexOfSupplementary', 'intern', 'isEmpty', 'join', 'lastIndexOf', 'lastIndexOfSupplementary', 'length', 'matches', 'nonSyncContentEquals', 'notify', 'notifyAll', 'offsetByCodePoints', 'regionMatches', 'registerNatives', 'replace', 'replaceAll', 'replaceFirst', 'split', 'startsWith', 'subSequence', 'substring', 'toCharArray', 'toLowerCase', 'toString', 'toUpperCase', 'trim', 'valueOf', 'wait']
>>> String.format.signatures()
[(['java/util/Locale', 'java/lang/String', 'java/lang/Object...'], 'java/lang/String'), (['java/lang/String', 'java/lang/Object...'], 'java/lang/String')]

Each pair contains the list of accepted arguments types, and the returned type.

Troubleshooting

Make sure a Java Development Kit (JDK) is installed on your operating system if you want to use PyJNIus on desktop. OpenJDK is known to work, and the Oracle Java JDK should work as well.

On windows, make sure JAVA_HOME points to your java installation, so PyJNIus can locate the jvm.dll file allowing it to start java. This shouldn't be necessary on OSX and Linux, but in case PyJNIus fails to find it, setting JAVA_HOME should help.

Support

If you need assistance, you can ask for help on our mailing list:

We also have a Discord server:

https://chat.kivy.org/

Contributing

We love pull requests and discussing novel ideas. Check out our contribution guide and feel free to improve PyJNIus.

The following mailing list and IRC channel are used exclusively for discussions about developing the Kivy framework and its sister projects:

License

PyJNIus is released under the terms of the MIT License. Please refer to the LICENSE file for more information.

Backers

Thank you to all our backers! 🙏 [Become a backer]

Sponsors

Support this project by becoming a sponsor. Your logo will show up here with a link to your website. [Become a sponsor]

More Repositories

1

kivy

Open source UI framework written in Python, running on Windows, Linux, macOS, Android and iOS
Python
17,477
star
2

python-for-android

Turn your Python application into an Android APK
Python
8,263
star
3

buildozer

Generic Python packager for Android and iOS
Python
1,708
star
4

plyer

Plyer is a platform-independent Python wrapper for platform-dependent APIs
Python
1,589
star
5

kivy-designer

UI designer for Kivy - DEPRECATED
Python
815
star
6

kivy-ios

Toolchain for compiling Python / Kivy / other libraries for iOS
Python
771
star
7

kivent

KivEnt is an entity-based game engine for Kivy
Python
573
star
8

audiostream

Audio API for streaming raw data to speakers
Python
190
star
9

pyobjus

Access Objective-C classes from Python
Python
177
star
10

kivy-website

Website of kivy.org
HTML
166
star
11

kivy-remote-shell

Remote SSH + Python interactive shell in Kivy
Python
110
star
12

oscpy

An efficient OSC implementation compatible with python2.7 and 3.5+
Python
109
star
13

kivy-launcher

Reboot of the older Kivy launcher
Python
107
star
14

pythonar

python auto reloader
Python
44
star
15

kivy-sdk-packager

Scripts for Kivy SDK generation on Windows, OS X and Linux
Python
38
star
16

kivy-berkelium

Berkelium extension for Kivy - DEPRECATED, use https://github.com/kivy-garden/garden.cefpython instead.
Python
25
star
17

p4a-cloud

Build cloud for Python for android - DEPRECATED
HTML
22
star
18

piki

kivy games for raspberry pi
Python
18
star
19

aprofiler

Simple tool that allow you to emit start/end event, and marks
Python
17
star
20

kivy-server

Docker configuration for the Kivy server
Shell
12
star
21

pycon2013

pycon 2013 kivy presentation
JavaScript
9
star
22

kivy-ideas

Various ideas related to the Kivy project.
9
star
23

condiment

Conditionally include or remove code, according to the environment variables
Python
7
star
24

kivy-translations

This is the repository where Kivy translations are managed - DEPRECATED
Python
7
star
25

plyer_demo

an android app to showcase all plyer features
Python
4
star
26

kivy-design

Graphical elements used by the Kivy Organization
4
star
27

ncis

Python
4
star
28

angle-builder

Build and releases ANGLE binaries for different platforms
Python
4
star
29

ncis-inspector

A Kivy app to interact with the NCIS module in Kivy apps
Python
3
star
30

p4a-pygame-bootstrap-components

The jni components of the python-for-android pygame bootstrap
C
3
star
31

kivy_pong_demo

Demo kivy pong-game app
Python
3
star
32

templates

This is a template repository, supposed to help developers with getting a quick setup of a kivy app repository that uses GitHub actions to build packages for various platforms.
Python
2
star
33

ncis-kivy

an ncis module to inspect kivy applications
Python
1
star
34

ncis-python

Python
1
star
35

kivy-website-docs

1
star
36

mcnotify

GitHub App that comments on predefined issues after certain events
JavaScript
1
star