使用Python调用Java第三方库

先说下我都用了哪些库: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路径:

使用Python调用Java第三方库_第1张图片

Javatest代码:

package com;

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

使用Python调用Java第三方库_第2张图片
打包成test.jar:


(1)使用.class调用

#-*-coding:utf-8-*-
import jpype
from jpype import *
#获得默认jvm路径,即jvm.dll文件路径
jvmPath = jpype.getDefaultJVMPath()
#java扩展包路径
ext_classpath = r'D:\code\H5\run\demo\bin'
jvmArg = '-Djava.class.path=%s'%ext_classpath
print jvmArg
if 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')
#关闭jvm
jpype.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.println
print jd.run("waw")
shutdownJVM()
注意:此处的jar用的是相对路径

查看jar包里面的路径:

使用Python调用Java第三方库_第3张图片

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

你可能感兴趣的:(Python2)