PyJNIus 是一个神奇的 Python 第三方模块。它能使用Java本地接口将Java类作为Python类访问的Python模块。
如果你需要在Python中使用Java 类,这个第三方模块是你最好的选择。
1.准备
开始之前,你要确保Python和pip已经成功安装在电脑上,如果没有,请访问这篇文章:超详细Python安装指南 进行安装。
(可选1) 如果你用Python的目的是数据分析,可以直接安装Anaconda:Python数据分析与挖掘好帮手—Anaconda,它内置了Python和pip.
(可选2) 此外,推荐大家用VSCode编辑器来编写小型Python项目:Python 编程的最好搭档—VSCode 详细指南
Windows环境下打开Cmd(开始—运行—CMD),苹果系统环境下请打开Terminal(command+空格输入Terminal),输入命令安装依赖:
pip install pyjnius
2.快速开始
使用Jnius导入Java类特别简单,你只需要引入 autoclass 并引用你所需要的类即可:
>>> 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
当你引入类后,你只需要按 Java 的函数操作即可,如上述代码中的 push 和 pop 函数。
最令人惊喜的是,你还能在安卓系统中利用这个模块使用Python调用Java类:
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)
输出结果如下:
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]
为了能实现上述效果,你需要使用:python-for-android.
这是Android上Python应用程序的打包工具。您可以创建自己的Python发行版(包括所需的模块和依赖项),并将其与自己的代码捆绑在APK中。
详细教程可以见GitHub:
https://github.com/kivy/python-for-android
3.进阶使用
当您使用 autoclass
时,它将发现指定Java类的所有方法和字段并对其进行解析。如果你只想声明和使用所需的内容。可以这么弄:
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') # 使用这个新类 print('DPI is', Hardware.getDPI()) Hardware.accelerometerEnable() for x in xrange(20): print(Hardware.accelerometerReading()) sleep(.1)
这种形式支持你只引入你想要使用的类,不会造成资源浪费,代码效率更高。
尤其是对于安卓系统有限的资源而言,推荐使用这种局部引入的方式。
当然,如果你是桌面系统(windows, macOS),资源相对充足,使用autoclass引入的方式是可以接受的。不过,在Windows上,确保 JAVA_HOME
指向你的Java安装路径,以便 PyJNIus 可以找到 jvm.dll
.
我们的文章到此就结束啦,如果你喜欢今天的 Python 教程,请持续关注Python实用宝典。
有任何问题,可以在公众号后台回复:加群,回答相应验证信息,进入互助群询问。
原创不易,希望你能在下面点个赞和在看支持我继续创作,谢谢!
Python实用宝典 ( pythondict.com )
不只是一个宝典
欢迎关注公众号:Python实用宝典