pyjnius 是一个神奇的 python 第三方模块。它能使用java本地接口将java类作为python类访问的python模块。
如果你需要在python中使用java 类,这个第三方模块是你最好的选择。
1.准备
开始之前,你要确保python和pip已经成功安装在电脑上,如果没有,可以访问这篇文章:超详细python安装指南 进行安装。
如果你用python的目的是数据分析,可以直接安装anaconda:python数据分析与挖掘好帮手—anaconda,它内置了python和pip.
此外,推荐大家用vscode编辑器,它有许多的优点:python 编程的最好搭档—vscode 详细指南。
请选择以下任一种方式输入命令安装依赖 :
windows 环境 打开 cmd (开始-运行-cmd)。macos 环境 打开 terminal (command+空格输入terminal)。如果你用的是 vscode编辑器 或 pycharm,可以直接使用界面下方的terminal.pip install pyjnius2.快速开始
使用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中。
详细教程可以见github:
https://github.com/kivy/python-for-android
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.
永兴新能源万吨电池级碳酸锂项目开工,改变当前锂盐供需格局
解决方案 | 车载镜头平整度精密测量,应该用什么传感器?
米家台灯Pro体验评测 设计非常简约没有过多的复杂设计
为什么可以利用FSMC来使用外部RAM
iPhone8上市时间确定:为iPhone8全面让路,iPhone7狂将至“白菜价”,你买吗?
PyJNIus :让你在Python中轻松调用Java方法
展示台的镜头
我国企业使用开源技术已成主流,开源软件使用占比为58.7%
御芯微入选2022年重庆市物联网产业协会优秀会员单位
2019年第一季度,歌尔股份的业绩预计有所好转
伺服电机的工作原理 伺服电机的特点
Super-TCXO 的崛起
华为软交换核心网力助TD-SCDMA商用
热式气体质量流量计的特点及注意事项
如何取消开机启动项
中国AI企业蓬勃发展 对智能计算机的需求也井喷
受惠于AI,法人看好金像电下季营收可望创高
三安光电发布澄清补充公告 与福建天电不属于关联交易
华为进军美国市场遇挫,疑接受难以赢得美国这场政治战争的事实
LC滤波器的设计