PyJNIus — 能让你在Python中轻松调用Java方法

PyJNIus 是一个神奇的 Python 第三方模块。它能使用Java本地接口将Java类作为Python类访问的Python模块。

如果你需要在Python中使用Java 类,这个第三方模块是你最好的选择。

1.准备

开始之前,你要确保Python和pip已经成功安装在电脑上

请选择以下任一种方式输入命令安装依赖
1. Windows 环境 打开 Cmd (开始-运行-CMD)。
2. MacOS 环境 打开 Terminal (command+空格输入Terminal)。
3. 如果你用的是 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 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,保证调用成功生效。

我们的文章到此就结束啦!

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Python调用Java接口,可以使用PyJNIus库来实现,该库是一个Python的JNI(Java Native Interface)实现。 以下是一个示例,假设Java有一个接口类`TestInterface`,其有一个方法`testMethod`,它接收一个字符串类型的参数并返回一个字符串类型的值。 Java代码: ```java public interface TestInterface { public String testMethod(String str); } ``` Python代码: ```python from jnius import autoclass # 加载Java类 TestClass = autoclass('TestInterface') # 创建Java对象 test_obj = TestClass() # 调用Java方法 result = test_obj.testMethod("Hello from Python!") # 打印返回值 print(result) ``` 在执行Python代码时,需要将Java类的class文件加载到JVM,可以通过设置`CLASSPATH`环境变量或使用`autoclass`函数的`classpath`参数来实现。 另外,如果Java方法有多个参数,可以使用`jobject`类型来传递Java对象,例如: Java代码: ```java public interface TestInterface { public int add(int a, int b); } ``` Python代码: ```python from jnius import autoclass # 加载Java类 TestClass = autoclass('TestInterface') # 创建Java对象 test_obj = TestClass() # 创建Java整数对象 a = autoclass('java.lang.Integer')(10) b = autoclass('java.lang.Integer')(20) # 调用Java方法 result = test_obj.add(a, b) # 打印返回值 print(result) ``` 注意:在使用PyJNIus库时,需要确保已经正确安装了Java环境,并且PythonJava的位数要一致。如果Python是64位的,则需要安装64位的Java环境。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值