java代码_在Python程序中调用Java代码的实现

ff1a15cb1d0552b1692f5e363fda1c68.gif

有头发且有趣的码农万里挑一~ 

14

有料叔 | 一位有故事的程序猿

前 言 359898b5b4b4fcfdb500bcb5a1a07fa0.png

开发Python程序,需求中需要用到Java码,Python作为“胶水”语言能够很好的实现这种需求。具体实现的过程如下:

359898b5b4b4fcfdb500bcb5a1a07fa0.png

1.环境准备

359898b5b4b4fcfdb500bcb5a1a07fa0.png

2.环境搭建

359898b5b4b4fcfdb500bcb5a1a07fa0.png

3.实验

1.环境准备

我实验过的两种搭配,都成功了,其他的搭配方式没有实验过不敢做过多的陈述,这里以搭配一为实验基础进行描述。

搭配一:windows 7(64位)+JDK(32位)+Python(32位)+eclipse+pycharm

搭配二:windows 7(64位)+JDK(6位)+Python(64位)+eclipse+pycharm光有以上的还不够,还需要一个作为桥梁的工具包,jpype1,这个工具包可以启动jvm,使java代码依然运行在jvm中。

实验过程中使用的各个工具的具体版本如下:

JDK(32位):1.8.0_211

Python(32位):3.7.2

jpype1(32位):0.6.3

eclipse+pycharm是两款开发工具,主要用来编写java和python代码

2.环境搭建

1.这里对JDK还有python的安装不做过多的称述。

2.jpype1的安装:

①:使用python自带的pip安装工具在线安装,发现不能正确安装,提示需要Microsoft Visual C++等,放弃。

②:使用python自带的pip安装工具离线安装,可以正确安装,但是问题来了,离线的安装包在哪里获取?如下链接可以获取,jpype1(32位):0.6.3。

链接:https://www.lfd.uci.edu/~gohlke/pythonlibs/#jpype

如图:下载对应自己python版本的离包(可以在cmd中键入 python命令查看python版本)(这里我选择倒数第二个,命名中带有amd64是适应python64位的,没有amd64的是适应python32位的)

      15510dac651f10c1488a324ae0248026.png

得到离线包之后,在cmd中使用命令:pip install离线包的位置可以顺利安装。(这里我已经安装过了没有截图,也懒得重新卸载再安装了)

3.实验

工具安装完毕之后,接下来看实验代码如何书写,借助eclipse开发java代码,并打jar包。

①:开发java代码

77afff67725962ed0cb71da4f518818a.png

②:打jar包

    bacd0fe3d84ffc5cf5adb92f11d4b763.png

   8f1d479b971a14f037ad60740f1bc22b.png

    dbe6cbea9d616f05bbe7c3c62f8f7854.png

经过打jar包之后,获得了jar文件。

e1f2c72358a875c58da730bb563c54a2.png

③开发python程序

3eb095013dfc13641fd230d98b87ad05.png

# 引入jpype模块import jpypeimport osif __name__ == '__main__':    """ 基本的开发流程如下:①、使用jpype开启jvm ②、加载java类 ③、调用java方法 ④、关闭jvm(不是真正意义上的关闭,卸载之前加载的类)    """# ①、使用jpype开启虚拟机(在开启jvm之前要加载类路径)# 加载刚才打包的jar文件

jarpath = os.path.join(os.path.abspath("."), "C:\\Users\\Administrator\\Desktop\\pythoncalljava-1-0-0.jar")    # 获取jvm.dll 的文件路径

jvmPath = jpype.getDefaultJVMPath()  

 # 开启jvm

jpype.startJVM(jvmPath,"-ea", "-Djava.class.path=%s" % (jarpath)) 

  # ②、加载java类(参数是java的长类名)javaClass = jpype.JClass("com.pythoncalljava.JavaClass")    # 实例化java对象# javaInstance = javaClass()# ③、调用java方法,由于我写的是静态方法,直接使用类名就可以调用方法    javaClass.show()    # ④、关闭jvm    jpype.shutdownJVM()    pass

④运行程序

c2e940f9b879ed60df091e47f00cf4c3.png

总结:

1.如果是调用多个jar文件的话,要在jvm启动时指定jar文件路径,

jarpath,jarpath2,jarpath3,jarpath4是jar文件路径。

jpype.startJVM(jvmPath,"-ea", "-Djava.class.path=%s;%s;%s;%s" % (jarpath,jarpath2,jarpath3,jarpath4))

2.实际上没有真正的停止jvm,jvm随着python程序的退出而结束(JVM has been shutdown是指卸载之前加载的类。)

c2e940f9b879ed60df091e47f00cf4c3.png

441dcb8f39f42778219c91d5f5b1ab74.png

转载自:https://w.url.cn/s/A1jiWHt

2d641218053a3c471ddfd01a4a78b495.png
留言区
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值