如何使用 Python 与 JPype 和 Pyjnius 调用 Java

使用 Python 调用 Java

我们都非常熟悉 Java 和 Python 编程语言。但两者都有各自的优点和缺点。如果我们将它们结合起来,两全其美,并开始使用Python调用 Java,结果会怎样呢?我们可以使用Java 现有的包、框架、库等,这些在 Python 中实现起来更具挑战性,或者根本不可用。
因此,我们需要集成 Python 和 Java,以充分利用这两种语言提供的各种工具和资源。其最大的用途是,开发人员现在可以享受 Java 广泛的生态系统,同时使用 Python 编程的简单性和易用性。

我们将了解如何使用 JPype 和 Pyjnius 等方式在 Python 中调用 Java,涵盖使用 Python 调用 Java 的优点、用例场景以及在此过程中面临的挑战和限制。

Java 使用 Python

爪哇

Java 是一种广泛使用的高级编程语言,由 Sun Microsystems 的 James Gosling 在 20 世纪 90 年代中期开发。Java 因其“一次编写,随处运行”的平台独立性而广为人知。这是通过它的 JVM 实现的,它可以在任何系统上运行。
Java 是数十亿移动设备中使用最广泛的语言,它采用面向对象的方法进行编程,语法简单,类似于 C++。
Java 的应用包括 Web 开发、移动应用程序开发等等。

蟒蛇_

Python 是由 Guido van Rossum 在 20 世纪 80 年代末开发的一种高级编程语言。它以简单性和可读性为基础,因为其简单、清晰、简洁的语法可以让开发人员轻松、快速、可靠地进行开发。
Python 支持多种编程范例,例如面向对象、函数式和过程式开发风格。多年来,它作为开发程序最简单、最方便的语言之一,已经建立了庞大的受众群体和知名度。Python的应用领域包括Web开发、数据分析等领域。

集成方法概述

使用 Python 调用 Java(JPype方法):

什么是 JPype 库?

JPype库是一个 Python 库,可帮助 Python 开发人员将 Java 代码集成到他们的 Python 应用程序中。它就像 Python 和 Java 之间的桥梁,允许 Python 程序与 Java 类、方法、对象和包进行交互。
JPype 可用于访问 Python 项目中现有的 Java 库和 Java 代码。

安装和设置 JPype:

在系统中安装 JPype,请使用以下 cmd 命令:

pip install JPype1

要将JPype1 导入到您的程序中,您可以使用以下命令:

import jpype
import jpype.imports

使用 JPype 的示例

jpype-示例/python/java.py

from jpype import startJVM, shutdownJVM, java
startJVM(convertStrings=False)
java.lang.System.out.println("hello world")
  
random = java.util.Random()
number1 = random.nextInt(10)
number2 = random.nextInt(10)
print(number1, number2)
shutdownJVM()

C:\Users\tanma\Downloads\jpype-example\python\java\calc.py

from jpype import startJVM, shutdownJVM, java, addClassPath, JClass, JInt
startJVM(convertStrings=False)
import jpype.imports
   
try:
    calc = JClass('calci')
    print(calc)
    print(dir(calc))
    res = calc.add(java.lang.Integer(2), java.lang.Integer(2))
    print(res)
    math = JClass('pkg.returnmath')
    res = math.divide(java.lang.Integer(6), java.lang.Integer(2))
    print(res)
   
except Exception as err:
    print(f"Exception: {err}")

在 calcl.py 文件中,我们从 Jpype 库导入一些主要方法,在进一步执行 Java 类时将需要这些方法。我们首先启动JVM,然后获取calci的类变量并将其存储到calc变量中;然后我们打印 calci 类的目录,然后创建一个 res 变量来存储整数的加法,然后打印结果。
之后,我们从 pkg 命名包中访问 returnmath 类,然后我们也对此执行相同的操作,然后我们也打印它的结果。
最后,我们在 try 块中执行所有这些执行以避免突然取消,而是选择了异常处理的开发方法。

C:\Users\tanma\Downloads\jpype-example\python\java\calci.java

public class calci {
    public static Integer add(Integer a, Integer b) {
        return a*b;
    }
}

在 calci.java 中,我们创建一个 java 类,它将返回随机生成的数字 a 和 b 的乘积。

C:\Users\tanma\Downloads\jpype-example\python\java\pkg\returnmath.java

package pkg;
   
public class returnmath {
    public static Integer divide(Integer a, Integer b) {
        return a/b;
    }
}

在 returnmath.java 中,我们只是创建一个类,它将返回随机生成的数字 a 和 b 的除法。

使用Python调用Java的其他方法:

我们可以选择使用各种其他方法来实现上述示例,例如使用 PyJnuis 或使用 Python 中的 JCC 库作为 Python 程序和 java 类、库或包之间的桥梁。
这些 Python 库提供了一种非常有用且方便的使用Python实现或调用 Java 的方法。

使用 Python 调用 Java 的好处

使用Python调用Java的原因有很多,如下:

  • 提供对 Java 库的访问
  • 无缝整合
  • 允许混合开发
  • 更高的跨平台兼容性
  • 提高性能
  • 访问 Java 的 GUI 应用程序,例如 swings
  • 广泛的社区支持

使用Python调用java时面临的挑战和限制

  • 兼容性问题:这种情况可能会发生,因为 Java 和 Python 的版本也可能不同,当桥接库与现有语言模型不兼容时,情况可能会更加复杂。
  • 性能开销:在两种语言之间传输数据时,Python 和 Java 的接口可能会引入性能瓶颈或性能开销。
  • 调试复杂性:调试这样的集成程序可能会很混乱,因为两种语言具有不同的语法,并且需要两种语言的专家来排除和调试任何问题或错误。
  • 资源管理:正确管理所有资源(例如 JVM 实例和内存)可能非常困难。
  • 整体影响Python的可读性和可维护性。
  • 有限的 Python 库支持:某些 Python 库可能无法与基于 java 的组件或库一起使用,因为它们不是为此而构建的,从而导致开发受到限制。

结论

到目前为止,我们已经了解了如何使用 Python 使用 Jpype 调用 Java。

显然,这对我们有利,因为我们将能够利用两种语言的优势。我们可以享受 Python 简单的语法,同时还可以访问 Java 的广泛库和框架支持。

使用 python 调用 java 也有其局限性,因为它需要两种语言的专业知识才能无缝集成两种语言并用它开发程序。

但请放心,在可定制性和平台独立性方面,这是一个非常可行的选择,并且我们不能否认使用 Python 调用 Java 可能具有的所有进一步未发现的可能性。

参考