[转]python调用Java-JPype使用介绍


======================================================
注:本文源代码点此下载
======================================================

python 作为一种灵活的软件开发语言在当今被广泛使用。在软件开发过程中,有时需要在 python 项目中利用既有的 java 代码,已达到节省时间和开发成本的目的。因此,找到一个 python 代码调用 java 代码的桥梁是非常有意义的。 jpype 就是这样的一个工具,利用它可以使 python 程序方便的调用 java 代码,从而扩充 python 语言的能力,弥补 python 语言的不足。本文介绍了如何利用 jpype 整合 python 程序和 java 程序的一些基本方法。

概览

jpype 是一个能够让 python 代码方便地调用 java 代码的工具,从而克服了 python 在某些领域(如服务器端编程)中的不足。

下载

jpype 可以从 sourceforge 网站上下载:http://sourceforge.net/projects/jpype/ 目前 jpype 最新的版本为 0.5.4,支持 python 2.5 和 2.6. 本文以 windows xp 平台,python 2.5.4 为例阐述。

安装

安装 jpype 前需要先安装 python 。从 http://www.python.org/download 下载 python 并安装,安装路径选择 c:\python25\,安装完成后在本地 c 盘应有 c:\python25 目录,该目录下有 python.exe 文件。 python 安装完后,双击下载的 jpype 安装文件即可安装 jpype 。

许可证

jpype 遵循的许可证是 apache license v2.0 。

jpype 的使用

一个简单的 hello world 程序

下面是一个简单的 python 程序,通过 jpype 调用 java 的打印函数,打印出字符串。

清单 1. hello world

import jpype

jvmpath = jpype.getdefaultjvmpath()

jpype.startjvm(jvmpath)

jpype.java.lang.system.out.println( “ hello world! ” )

jpype.shutdownjvm()

启动 jvm

jpype 提供的 startjvm() 函数的作用是启动 java 虚拟机,所以在后续的任何 java 代码被调用前,必须先调用此方法启动 java 虚拟机。

jpype.startjvm() 的定义

startjvm(jvm, *args)

jpype.startjvm() 的参数

参数 1: jvm, 描述你系统中 jvm.dll 文件所在的路径,如“ c:\program files\ibm\java50\jre\bin\j9vm\jvm.dll ”。可以通过调用 jpype.getdefaultjvmpath() 得到默认的 jvm 路径。

参数 2: args, 为可选参数,会被 jpype 直接传递给 jvm 作为 java 虚拟机的启动参数。此处适合所有合法的 jvm 启动参数,例如:

-agentlib:libname[=options]

-classpath classpath

-verbose

-xint

清单 2. jpype.startjvm() 的用法示例

import jpype

jvmpath = jpype.getdefaultjvmpath()

jvmarg = “ -xint ”

jpype.startjvm(jvmpath,jvmarg)

判断 jvm 是否启动

jpype 提供的 jpype.isjvmstarted() 函数的作用是判断 jvm 是否已启动。

jpype.isjvmstarted() 的定义

isjvmstarted()

jpype.isjvmstarted() 的返回值

返回值为 true 表示 jvm 已经启动,返回值为 false 表示 jvm 还未启动

清单 3. jpype.isjvmstarted() 的用法示例

import jpype

jvmpath = jpype.getdefaultjvmpath()

jvmarg = “ -xint ”

if not jpype.isjvmstarted():

jpype.startjvm(jvmpath,jvmarg)

关闭 jvm

当使用完 jvm 后,可以通过 jpype.shutdownjvm() 来关闭 jvm,该函数没有输入参数。当 python 程序退出时,jvm 会自动关闭。

引用第三方的 java 扩展包

很多时候,在 python 项目中需要调用第三方的 java 扩展包,这也是 jpype 的一个重要用途。为了使编程者方便地在 python 代码中调用已有的 java 扩展包,我们可以再在 jvm 启动参数增加:

-djava.class.path=ext_classpath

以下为调用第三方 java 扩展包示例,(假设第三方 java 扩展包的所在路径是 e:\javaext)

清单 4. 调用第三方 java 扩展包示例

import jpype

jvmpath = jpype.getdefaultjvmpath()

ext_classpath = “ e:\\javaext ”

jvmarg = “ -djava.class.path = ” + ext_classpath

if not jpype.isjvmstarted():

jpype.startjvm(jvmpath, jvmarg)

访问 java 的系统属性

有时,某些 java 应用需要设置或者获取 jvm 中的系统属性。

在 jvm 启动时设置系统变量示例:

在 jvm 的启动参数中加入如下参数:

-dproperty=value

假设你要设置的属性名为 yourproperty,属性值为 yourvalue 。

清单 5. jvm 启动时设置系统变量示例

import jpype

jvmpath = jpype.getdefaultjvmpath()

jvmarg = “ -dyourproperty=yourvalue ”

if not jpype.isjvmstarted():

jpype.startjvm(jvmpath,jvmarg)

清单 6. 在程序中设置系统变量示例

import jpype

prop = “ yourproperty ”

value = “ yourvalue ”

system = jpype.jclass('java.lang.system')

system.setproperty(str(prop),str(value))

清单 7. 在程序中获取系统变量示例

import jpype

prop = “ yourproperty ”

system = jpype.jclass('java.lang.system')

value = system.getproperty(str(prop))

java 类型到 python 类型的转换

表 1. java 类型到 python 类型的转换

java 类型

转换成的 python 类型

byte, short and int

int

long

long

float and double

float

boolean

int of value 1 or 0

char

unicode of length 1

string

unicode

arrays

jarray

other java object

javaobject

class

javaclass

array class

javaarrayclass

quote: http://www.linuxeden.com/html/sysadmin/20091022/68741.html


======================================================
在最后,我邀请大家参加新浪APP,就是新浪免费送大家的一个空间,支持PHP+MySql,免费二级域名,免费域名绑定 这个是我邀请的地址,您通过这个链接注册即为我的好友,并获赠云豆500个,价值5元哦!短网址是http://t.cn/SXOiLh我创建的小站每天访客已经达到2000+了,每天挂广告赚50+元哦,呵呵,饭钱不愁了,\(^o^)/
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
使用 `jpype` 调用 Java 包需要先安装 `jpype` 库,可以使用 `pip` 命令进行安装: ``` pip install jpype1 ``` 然后,可以按照以下步骤使用 `jpype` 调用 Java 包并传参: 1. 首先,需要启动 JVM 进程,可以使用 `jpype.startJVM()` 函数来启动: ```python import jpype jpype.startJVM() ``` 2. 导入 Java 类: ```python java_class = jpype.JClass('com.example.MyClass') ``` 其中,`com.example.MyClass` 是要调用Java 类的全限定名。 3. 创建 Java 对象: ```python java_object = java_class() ``` 4. 调用 Java 方法: ```python result = java_object.myMethod('param1', 'param2') ``` 其中,`myMethod` 是要调用Java 方法名,`'param1'`、`'param2'` 是传递给 Java 方法的参数。 5. 关闭 JVM: ```python jpype.shutdownJVM() ``` 完整示例代码如下: ```python import jpype # 启动 JVM jpype.startJVM() # 导入 Javajava_class = jpype.JClass('com.example.MyClass') # 创建 Java 对象 java_object = java_class() # 调用 Java 方法 result = java_object.myMethod('param1', 'param2') # 关闭 JVM jpype.shutdownJVM() ``` 注意,如果 Java 类需要传递复杂类型的参数,需要先将 Python 对象换为 Java 对象。可以使用 `jpype.java` 模块中的函数进行换,例如: ```python import jpype # 启动 JVM jpype.startJVM() # 导入 Javajava_class = jpype.JClass('com.example.MyClass') # 创建 Java 对象 java_object = java_class() # Python 对象为 Java 对象 param1 = jpype.java.lang.String('hello') param2 = jpype.JArray(jpype.JInt)([1, 2, 3]) # 调用 Java 方法 result = java_object.myMethod(param1, param2) # 关闭 JVM jpype.shutdownJVM() ``` 在上面的示例中,`jpype.java.lang.String` 将 Python 字符串换为 Java 字符串,`jpype.JArray` 将 Python 列表换为 Java 数组。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值