python怎么调用java类
- 后端开发
- 2025-09-02
- 6
Py4J
或
JPype
等库来调用Java类。
现代软件开发中,Python 和 Java 是两种非常流行的编程语言,我们可能需要在一个 Python 程序中调用一个 Java 类或方法,这可以通过几种不同的方法来实现,包括使用 JNI(Java Native Interface)、JPype、Py4J 等工具,本文将详细介绍如何在 Python 中调用 Java 类,并提供一些示例代码来帮助你理解和实现这一过程。
使用 JNI(Java Native Interface)
JNI 是 Java 提供的一种机制,允许 Java 代码与用其他语言编写的代码进行交互,虽然 JNI 非常强大,但它的使用相对复杂,需要编写一些 C/C++ 代码作为桥梁,以下是一个基本的步骤:
步骤 1: 编写 Java 类
我们需要编写一个简单的 Java 类,并将其编译成一个 JAR 文件。
// HelloWorld.java public class HelloWorld { public void sayHello() { System.out.println("Hello from Java!"); } }
编译并打包成 JAR 文件:
javac HelloWorld.java jar cvf helloworld.jar HelloWorld.class
步骤 2: 编写 JNI 代码
我们需要编写一些 C/C++ 代码来调用 Java 类,这里我们使用 C++ 作为示例。
// HelloWorldJNI.cpp #include <jni.h> #include <iostream> int main() { JavaVM jvm; JNIEnv env; JavaVMInitArgs vm_args; JavaVMOption options[1]; options[0].optionString = "-Djava.class.path=."; vm_args.version = JNI_VERSION_1_6; vm_args.nOptions = 1; vm_args.options = options; vm_args.ignoreUnrecognized = false; // 创建 Java 虚拟机 int res = JNI_CreateJavaVM(&jvm, (void)&env, &vm_args); if (res < 0) { std::cerr << "无法创建 Java 虚拟机" << std::endl; return -1; } // 查找并调用 Java 类的方法 jclass cls = env->FindClass("HelloWorld"); if (cls == nullptr) { std::cerr << "无法找到 HelloWorld 类" << std::endl; return -1; } jmethodID mid = env->GetMethodID(cls, "sayHello", "()V"); if (mid == nullptr) { std::cerr << "无法找到 sayHello 方法" << std::endl; return -1; } jobject obj = env->AllocObject(cls); env->CallVoidMethod(obj, mid); // 销毁 Java 虚拟机 jvm->DestroyJavaVM(); return 0; }
编译并运行:
g++ -o HelloWorldJNI HelloWorldJNI.cpp -I${JAVA_HOME}/include -L${JAVA_HOME}/lib/server -ljvm ./HelloWorldJNI
使用 JPype
JPype 是一个允许 Python 程序调用 Java 类的库,它比 JNI 更简单,因为它不需要编写 C/C++ 代码,以下是如何使用 JPype 的步骤:
步骤 1: 安装 JPype
你需要安装 JPype,你可以使用 pip 来安装:
pip install jpype1
步骤 2: 编写 Python 代码
我们可以编写 Python 代码来调用 Java 类。
import jpype import jpype.imports from jpype.types import # 启动 JVM jpype.startJVM(classpath=['.']) # 导入 Java 类 from java.lang import System from HelloWorld import HelloWorld # 创建 Java 类的实例 hello = HelloWorld() # 调用 Java 方法 hello.sayHello() # 关闭 JVM jpype.shutdownJVM()
使用 Py4J
Py4J 是另一个允许 Python 程序调用 Java 类的库,它通过创建一个网关来桥接 Python 和 Java,以下是如何使用 Py4J 的步骤:
步骤 1: 安装 Py4J
你需要安装 Py4J,你可以使用 pip 来安装:
pip install py4j
步骤 2: 编写 Java 代码
我们需要编写一个简单的 Java 类,并将其编译成一个 JAR 文件。
// HelloWorld.java public class HelloWorld { public void sayHello() { System.out.println("Hello from Java!"); } }
编译并打包成 JAR 文件:
javac HelloWorld.java jar cvf helloworld.jar HelloWorld.class
步骤 3: 编写 Python 代码
我们可以编写 Python 代码来调用 Java 类。
from py4j.java_gateway import JavaGateway # 启动 Java 网关 gateway = JavaGateway() # 获取 Java 类的实例 hello = gateway.entry_point.getHelloWorld() # 调用 Java 方法 hello.sayHello() # 关闭 Java 网关 gateway.close()
使用相关问答FAQs
Q1: JPype 和 Py4J 有什么区别?
A1: JPype 和 Py4J 都是用于在 Python 中调用 Java 类的库,但它们有一些不同之处,JPype 直接与 JVM 交互,允许你像使用 Python 模块一样使用 Java 类,而 Py4J 则通过创建一个网关来桥接 Python 和 Java,它更适合于需要在 Python 和 Java 之间传递复杂对象的情况。
Q2: 使用 JNI 调用 Java 类有什么优缺点?
A2: 使用 JNI 调用 Java 类的优点是可以与 Java 代码进行非常低级别的交互,适合需要高性能的场景。