0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

PyJNIus:在Python中轻松调用Java方法

科技绿洲 来源:Python实用宝典 作者:Python实用宝典 2023-10-30 11:32 次阅读

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

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

1.准备

开始之前,你要确保Python和pip已经成功安装在电脑上,如果没有,可以访问这篇文章:超详细Python安装指南 进行安装。

如果你用Python的目的是数据分析,可以直接安装Anaconda:Python数据分析与挖掘好帮手—Anaconda,它内置了Python和pip.

此外,推荐大家用VSCode编辑器,它有许多的优点:Python 编程的最好搭档—VSCode 详细指南

请选择以下任一种方式输入命令安装依赖

  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,保证调用成功生效。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 接口
    +关注

    关注

    33

    文章

    8496

    浏览量

    150834
  • JAVA
    +关注

    关注

    19

    文章

    2957

    浏览量

    104544
  • python
    +关注

    关注

    56

    文章

    4782

    浏览量

    84449
收藏 人收藏

    评论

    相关推荐

    Python调用Java扩展包HanLP测试记录

    、神经网络依存句法分析)。由于自己才疏学浅,对JAVA方面了解不多,所以打算在Python环%2, line 5, in <module>startJVM
    发表于 12-12 16:27

    Python的类方法、实例方法和静态方法

    Python实例属性和实例方法Python类属性和类方法
    发表于 11-05 06:25

    后端选择 java, 还是 python?

    容易学习和容易上手,所以学习成本略高于 Python。其次,虽然 Java 市面上招聘很多,这也导致了学习 Java 的人特别多,Java
    发表于 09-26 14:07

    C/C++调用Java不同类的静态方法有哪些

    C/C++调用Java不同类的静态方法有哪些?C/C++调用
    发表于 09-30 08:12

    如何用java映射创建java对象和调用java对象呢

    java是一种解析语言,java程序是通过java虚拟机解析.class的方式运行起来。因此,java中就存在java映射的概念。下面介绍如
    发表于 04-11 14:43

    如何用java映射创建java对象和调用java对象的方法

    java是一种解析语言,java程序是通过java虚拟机解析.class的方式运行起来。因此,java中就存在java映射的概念。一、首先我
    发表于 07-28 16:11

    JNI java调用so动态库方法

    JNI Java调用so包相关问题总结,出现了很多问题,按照操作应该不会发生不到so包的错误,其实最后出现的也是说加载不到libpython2.7.x.so.1,我就纳闷了,怎么和python扯上
    发表于 11-28 13:13 3503次阅读

    Java方法调用Lua function

    Java先载入login.lua脚本并编译,然后再获取指定名称的函数,无参的直接使用call()方法调用,带参的需要通过invoke(LuaValue[])传入参数表。
    的头像 发表于 09-07 10:47 1356次阅读

    Java如何判断字符相等

    Python判断字符相等与判断数字类型时所用的方法相同都是使用”==”来进行判定,Java
    的头像 发表于 02-24 10:41 768次阅读
    <b class='flag-5'>Java</b><b class='flag-5'>中</b>如何判断字符相等

    Python轻松调用Java方法-PyJNIus

    PyJNIus 是一个神奇的 Python 第三方模块。它能使用Java本地接口将Java类作为Python类访问的
    的头像 发表于 02-24 13:49 1693次阅读

    Python环境搭建和LabVIEW调用

    本文主要介绍Python相关的环境搭建、Anaconda的使用以及LabVIEW调用Python
    的头像 发表于 10-13 17:56 2893次阅读
    <b class='flag-5'>Python</b>环境搭建和LabVIEW<b class='flag-5'>中</b>的<b class='flag-5'>调用</b>

    PyJNIus :让你在Python轻松调用Java方法

    PyJNIus 是一个神奇的 Python 第三方模块。它能使用Java本地接口将Java类作为Python类访问的
    的头像 发表于 11-01 10:45 794次阅读

    shell调用java并返回执行结果

    Shell脚本调用Java程序并获取执行结果,可以通过以下步骤实现: 编写Java程序:首先,你需要编写一个
    的头像 发表于 11-08 10:32 1563次阅读

    python调用math函数的方法

    。本文将详细介绍math模块的各种数学函数的调用方法,包括函数的功能、参数的使用和返回值的含义等方面,以帮助读者更好地理解和应用这些函数。 一、导入math模块 要使用math模块
    的头像 发表于 11-22 11:01 2799次阅读

    python调用windows命令

    Windows命令,提供一些实际的示例和代码。 首先,我们需要了解一些基本概念。Windows命令是一种命令行界面(CLI),它允许用户通过键入命令来与操作系统进行交互。Python提供了一个名为 subprocess 的内置模块,它允许我们
    的头像 发表于 11-29 14:34 993次阅读