使用Python调用Java第三方库

来源:互联网 发布:大数据text下载 编辑:程序博客网 时间:2024/06/02 05:43

先说下我都用了哪些库:jpype、jython、pyjnius、py4j。这些库(除了jython是独立的语言)都可以达到Python执行Java代码的作用。而我统统试了个遍。。。

一开始试了一遍,只有jython可以用,其余的都报各种错。但是jython有个缺点,就是没法用编译器执行,因为.java编译后的.class没法再编译器中读取,而jython偏偏要执行的就是.class文件,所以就导致一个现象:在编译器中编写jython代码,然后在DOS中执行代码。。。。显然很无语,不适合项目使用,只能自己玩玩。所以又跑回去继续研究jpype,相对来说jpype的资料能多那么一点点,而且官网也有文档,只不过官网的文档比较过时了,还停留在python2.6和Java6。后来在网上找了很多的资料,其中很多都是直接引用官方的文档,只有少数的原创,而且很多并没有说的很明白,所以一错再错。不过功夫不负有心人,总算还是弄懂了,特写此文章,供大家参考。

配置:Python2.7.13、Java1.8.0_131

.java路径:


Javatest代码:

package com;public class Javatest {public String run(String str){return str;}public String testParam(String user){return "Hi,welcome" + user;}}
编译后目录(这里的.class是我手动转移的路径,放在bin或者其他目录都可以):


打包成test.jar:


(1)使用.class调用

#-*-coding:utf-8-*-import jpypefrom jpype import *#获得默认jvm路径,即jvm.dll文件路径jvmPath = jpype.getDefaultJVMPath()#java扩展包路径ext_classpath = r'D:\code\H5\run\demo\bin'jvmArg = '-Djava.class.path=%s'%ext_classpathprint jvmArgif not jpype.isJVMStarted():    #启动Java虚拟机    jpype.startJVM(jvmPath,'-ea',jvmArg)jpype.java.lang.System.out.println('Hello world!')#获取相应的Java类javaClass = JClass("com.Javatest")javaInstance = javaClass()#调用Java方法javaInstance.run('123')#关闭jvmjpype.shutdownJVM()
注意:这里的ext_classpath指的是.class文件的的引用路径之前的路径,如:

Javatest.class文件的全路径是:D:\code\H5\run\demo\src\com\Javatest.class,Javatest类的包路径(看上面的目录结构)是com,所以此处ext_classpath='D:\code\H5\run\demo\src';JClass的路径就是Javatest类的包路径:JClass('com.Javatest')

(2)使用jar包调用Java类

startJVM(jvmPath, "-ea","-Djava.class.path=test12.jar")JDClass = JClass("com.Javatest")jd = JDClass()jprint = java.lang.System.out.printlnprint jd.run("waw")shutdownJVM()
注意:此处的jar用的是相对路径

查看jar包里面的路径:


好了,大概使用方法就到这了,其实这里尤其要注意的就是路径问题,文件路径和类的包路径。

原创粉丝点击