Python调用JAVA包-从入门到放弃

前言

近段时间在做接口的时候就碰上了需要用到Java包内函数以作请求加解密,由于我python和java都贼差,算法看不懂,翻译不出同等作用的python代码,所以不得不向Java屈服(哭泣ing..)虽无法否认Java在处理很多问题上确实比Python要好那么一丢丢,但我们Python也很强呀,身为胶水语言,没有什么是我们Python做不了的事呢~(喂,你很拽哦!)以下,真的不来围观吗~~

Jpype简述

咳咳,其实这一段可以自行谷歌or百度,但作为学习笔记,还是有必要啰嗦一遍~

  • Jpype定义

进入Jpype官网 可以看到一段描述:

JPype是允许python程序完全访问java类库的一项行为活动。这不是像Jython/JPython那样通过重新实现Python来实现的,而是通过在两台虚拟机中进行本地级的接口来实现的

简单来说,其实也就是用来克服Python在某些领域上(如服务器端的编程)的不足,方便我们调用Java程序来进行其它开发工作等。

  • Jpype与Jython的区别

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

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

Jpype安装

emmmm,这个安装过程,是大坑,天坑!!(what the … hell :)….)

  • 环境准备

我的环境配置是:

1
2
3
Win 7/10 
Python 3.6 (64 bit)
Java:jdk1.8.0_181 (64 bit)

PS:python的环境一定要跟java的环境要一致,不然调用jvm时会报内存泄露哟~

  • 安装jpype库

使用pip install jpype1进行安装,运行后你会发现,蹭蹭蹭,报错啦!

根据错误提示,是缺少了VS C++插件,我在 Flask-Apache-mod-wsgi-踩坑记 这篇博客上有提到插件的地址,在这里再放一下地址 - > Visual C++编译器下载地址 记得给我点赞哟嘻嘻~

  • 再次安装jpype

当你装完插件后,执行pip,仍然报错了,那就试试第二种方法吧~

从网上下载jpype1 相关的库文件,传送门 -> jpype库文件,根据步骤一步步安装,以下:

1)手动安装 wheel
C:\Python36\Scripts>pip install wheel

2)待wheel安装成功后,再次安装已经下载的 JPype1-0.6.2-cp36-cp36m-win_amd64.whl 文件
C:\Python36\Scripts>pip install JPype1-0.6.2-cp36-cp36m-win_amd64.whl

3)成功安装后,尝试运行简单的调用jvm脚本,发现还是有报错
ImportError: numpy.core.multiarray failed to import

4)通过报错可判断可能是缺少了numpy库,再次安装pip install numpy, 安装过慢可以尝试用pip install -i https://pypi.tuna.tsinghua.edu.cn/simple numpy

进行安装,稍等片刻后,我们再运行调用JVM的脚本

1
2
3
4
5
6
7
8
import jpype
jvmPath = jpype.getDefaultJVMPath() # 默认的JVM路径
print(jvmPath)
jpype.startJVM(jvmPath)
jpype.java.lang.System.out.println("hello world!")
jpype.java.lang.System.out.println("I hate you!")

jpype.shutdownJVM()

此时运行后,后台没有报错,恭喜啦啦啦你终于成功安装了jpype,然后我们就可以愉快的玩耍了~~~

(ps:如果还是有报错,大家就自行百度相应的报错找解决方法啦,恕我无能为力啦~)

Jpype运用

其实到了这里我都感觉自己不知道可以说啥了,毕竟网上描述jpype使用的教程实在是太多了,而且非常的详细,我就不多说啦,在这里贴下我的实际运用代码,大家可以自行参考下哦~

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
from jpype import *   #引入jpype

class All_get(object):
def __init__(self):
jvmpath = getDefaultJVMPath() #获取默认的JVM路径
jarpath = ["E:\Java_jar\java-utils.jar"] # 你需要调用的jar包路径
jvmarg = "-Djava.class.path={}".format(":".join(jarpath)) # jvm启动参数,调用第三方java拓展包
if not isJVMStarted():
startJVM(jvmpath, jvmarg) # 启动JVM虚拟机
self.aesutils = JClass('com.cryption.aes.AESUtils') #实例化对象
self.rsautils = JClass('com.cryption.rsa.RSAUtils')

def dec_aes(self, data, key):
self.aes = self.aesutils.decrypt(data, key) # 调用java对象的方法
return self.aes

def dec_rsa(self, data, key):
self.rsa = self.rsautils.decrypt(data, key) # 调用java对象的方法
return self.rsa

def dec_sign(self, content_re, sign_re, org_pub):
self.sign_dec = self.rsautils.checkSign(content_re, sign_re, org_pub) # 调用java对象的方法
return self.sign_dec

if __name__ == '__main__':
All_get()
shutdownJVM() # 关闭JVM虚拟机

以上就是我常用的代码啦,是不是很简单呢,哈哈哈,主要还是安装过程比较繁琐,要耐心哟~

抛弃Jpype

为啥要抛弃呢?这个问题问得好,陈独秀同学请你坐下~

虽说jpype可以很方便的让我们调用java包方法,但每一次的调用都要启动一次JVM,非常的耗内存和降低了运行效率,因此如果能用python实现java的方法的话,这样就是最好的啦,同时锻炼两种语言能力哟~

由于加解密算法是公司机密,这里就不贴出来啦嘻嘻,希望大家都能用python愉快的工作哟~

0%