PyJNIus 是一个神奇的 Python 第三方模块。它能应用Java本地接口将Java类作为Python类拜访的Python模块。
如果你须要在Python中应用Java 类,这个第三方模块是你最好的抉择。
1.筹备
开始之前,你要确保Python和pip曾经胜利装置在电脑上。
如果你用Python的目标是数据分析,能够间接装置Anaconda,它内置了Python和pip.
此外,举荐大家用VSCode编辑器,它有许多的长处。
请抉择以下任一种形式输出命令装置依赖:
- Windows 环境 关上 Cmd (开始-运行-CMD)。
- MacOS 环境 关上 Terminal (command+空格输出Terminal)。
- 如果你用的是 VSCode编辑器 或 Pycharm,能够间接应用界面下方的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 sleepfrom jnius import autoclassHardware = 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.pyI/python ( 5983): DPI is 160I/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中。
3.进阶应用
当您应用 autoclass
时,它将发现指定Java类的所有办法和字段并对其进行解析。如果你只想申明和应用所需的内容。能够这么弄:
from time import sleepfrom jnius import MetaJavaClass, JavaClass, JavaMethod, JavaStaticMethodclass 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编程学习圈,或是返回编程学习网,理解更多编程技术常识,还有大量干货学习材料能够支付!