JPype实现在python中调用JAVA的实例


Posted in Python onJuly 19, 2017

一、JPype简述

1.JPype是什么?

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

2.JPype与Jython(JPython后继者)的区别?

1)运行环境不同:jython运行在jvm上,而JPype的实际运行环境仍然是python runtime,只是在运行期间启动了一个嵌入的jvm;

  2)使用者不同:jython是给java程序玩的,JPype是给python程序员玩的。

二、JPype安装

 1.先安装Python2.7和JAVA1.6

 2.安装JPype-0.5.4.2.win32-py2.7.exe(http://sourceforge.net/projects/jpype/files/JPype/0.5.4/)

 3.Ubuntu12.04安装命令:sudo apt-get install python-jpype

三、JPype使用说明

 1.启动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.关闭JVM

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

3.引用第三方Java扩展包

很多时候,在 python 项目中需要调用第三方的 Java 扩展包,这也是 JPype 的一个重要用途。

通过在 JVM 启动参数增加:-Djava.class.path=ext_classpath,实现在 python 代码中调用已有的 Java 扩展包。

 4.访问JAVA的系统属性

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

  1. 在 JVM 启动时设置系统变量示例:
  2. 在 JVM 的启动参数中加入如下参数:
-Dproperty=value

四、举例

1.直接调用JAVA API

from jpype import * 
import os.path 
startJVM("C:/Java/jdk1.6.0_10/jre/bin/client/jvm.dll", "-ea") 
java.lang.System.out.println("hello World") 
shutdownJVM()

2.调用JAVA第三方扩展包

1)JAVA自定义第三方jar包:将JpypeDemo类打包为jpypedemo.jar文件并存储到F:/sample_Py目录下

package jpype; 
 
public class JpypeDemo { 
public String sayHello(String user){ 
return "hello" + user; 
} 
public int calc(int a, int b){ 
return a + b;  
} 
}

  2)Python调用第三方JAVA jar包程序

from jpype import * 
import os.path 
jarpath = os.path.join(os.path.abspath('.'), 'F:/sample_Py/') 
startJVM("C:/Java/jdk1.6.0_10/jre/bin/client/jvm.dll","-ea", "-Djava.class.path=%s" % (jarpath + 'jpypedemo.jar')) 
#ubuntu 中startJVM("/home/geek/Android/jdk1.6.0_43/jre/lib/i386/server/libjvm.so","-ea", "-Djava.class.path=%s" % (jarpath + 'XXX.jar')) 
JDClass = JClass("jpype.JpypeDemo") 
jd = JDClass() 
#jd = JPackage("jpype").JpypeDemo() #两种创建jd的方法 
jprint = java.lang.System.out.println 
jprint(jd.sayHello("waw")) 
jprint(jd.calc(2,4)) 
shutdownJVM()

3.访问JAVA的系统属性

 假设你要设置的属性名为 yourProperty,属性值为 yourValue 。

1)JVM启动时设置系统变量示例

import jpype 
 jvmPath = jpype.getDefaultJVMPath() 
 jvmArg = “ -DyourProperty=yourValue ”
 if not jpype.isJVMStarted(): 
  jpype.startJVM(jvmPath,jvmArg)

2)在程序中设置系统变量示例

import jpype 
 prop = “ yourProperty ”
 value = “ yourValue ”
 system = jpype.JClass('java.lang.System') 
 system.setProperty(str(prop),str(value))

3)在程序中获取系统变量示例

import jpype 
 prop = “ yourProperty ”
 system = jpype.JClass('java.lang.System') 
 value = system.getProperty(str(prop))

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python使用gensim计算文档相似性
Apr 10 Python
Linux上安装Python的PIL和Pillow库处理图片的实例教程
Jun 23 Python
利用Python找出序列中出现最多的元素示例代码
Dec 08 Python
基于Python的文件类型和字符串详解
Dec 21 Python
numpy中实现二维数组按照某列、某行排序的方法
Apr 04 Python
Python中判断输入是否为数字的实现代码
May 26 Python
Python字符串的一些操作方法总结
Jun 10 Python
Python字符串对象实现原理详解
Jul 01 Python
Django发送邮件和itsdangerous模块的配合使用解析
Aug 10 Python
python将print输出的信息保留到日志文件中
Sep 27 Python
pytorch查看通道数 维数 尺寸大小方式
May 26 Python
详解Python中的GIL(全局解释器锁)详解及解决GIL的几种方案
Jan 29 Python
简单谈谈Python中的json与pickle
Jul 19 #Python
利用Python操作消息队列RabbitMQ的方法教程
Jul 19 #Python
高效测试用例组织算法pairwise之Python实现方法
Jul 19 #Python
Python实现将文本生成二维码的方法示例
Jul 18 #Python
Python实现动态加载模块、类、函数的方法分析
Jul 18 #Python
Python使用plotly绘制数据图表的方法
Jul 18 #Python
python中日志logging模块的性能及多进程详解
Jul 18 #Python
You might like
CI框架中libraries,helpers,hooks文件夹详细说明
2014/06/10 PHP
php中的explode()函数实例介绍
2019/01/18 PHP
正则表达式判断是否存在中文和全角字符和判断包含中文字符串长度
2008/09/27 Javascript
document.getElementById方法在Firefox与IE中的区别
2010/05/18 Javascript
Jquery动态改变图片IMG的src地址示例
2013/06/25 Javascript
一个JS函数搞定网页标题(title)闪动效果
2014/05/13 Javascript
js实现在网页上简单显示时间的方法
2015/03/02 Javascript
jquery点击展示与隐藏更多内容
2016/12/03 Javascript
解决vue项目使用font-awesome,build后路径的问题
2018/09/01 Javascript
vue-router之nuxt动态路由设置的两种方法小结
2018/09/26 Javascript
express启用https使用小记
2019/05/21 Javascript
基于jQuery的时间戳与日期间的转化
2019/06/21 jQuery
vue+elementUI 复杂表单的验证、数据提交方案问题
2019/06/24 Javascript
微信小程序HTTP请求从0到1封装
2019/09/09 Javascript
JavaScript canvas基于数组生成柱状图代码实例
2020/03/06 Javascript
[51:53]DOTA2-DPC中国联赛 正赛 RNG vs Dragon BO3 第二场 1月24日
2021/03/11 DOTA
Python循环语句中else的用法总结
2016/09/11 Python
Python的时间模块datetime详解
2017/04/17 Python
用python处理图片之打开\显示\保存图像的方法
2018/05/04 Python
Python把csv数据写入list和字典类型的变量脚本方法
2018/06/15 Python
python: 判断tuple、list、dict是否为空的方法
2018/10/22 Python
使用PyQtGraph绘制精美的股票行情K线图的示例代码
2019/03/14 Python
在Python函数中输入任意数量参数的实例
2019/07/16 Python
Python generator生成器和yield表达式详解
2019/08/08 Python
Python time库基本使用方法分析
2019/12/13 Python
windows10在visual studio2019下配置使用openCV4.3.0
2020/07/14 Python
python基于pygame实现飞机大作战小游戏
2020/11/19 Python
使用javascript和HTML5 Canvas画的四渐变色播放按钮效果
2014/04/10 HTML / CSS
Canvas环形饼图与手势控制的实现代码
2019/11/08 HTML / CSS
巧克力领导品牌瑞士莲美国官网:Lindt Chocolate美国
2016/08/25 全球购物
台湾森森购物网:U-mall
2017/10/16 全球购物
英国游戏机和游戏购物网站:365games.co.uk
2018/06/18 全球购物
会计电算化应届生求职信
2013/11/03 职场文书
离婚答辩状范文
2015/05/22 职场文书
物业保洁员管理制度
2015/08/05 职场文书
文艺委员竞选稿
2015/11/19 职场文书