【java配置篇二】跨平台python调用jar包

   

以下以自己的ocr.jar包在python平台调用为实例,记录全程。

   

ocr.jar 用法

1、导入到自己的项目dependencies中

2、调用函数 OcrandSegmentation( picturePath,serviceUrl,keyPath );

   

一、python调用方法如下

一、搭建环境

配置:重点(Python和JDK的位数一定要相同)

*JDK 1.8.0_191 64位

python 3.6.9 64位

1、安装JPype:

http://www.lfd.uci.edu/~gohlke/pythonlibs 下载对应版本JPype(我下载了JPype1-0.7.0-cp36-cp36m-win_amd64.whl,截止到2019年11月10日为最新版本)

注意:网上教程多为anaconda prompt中命令行:pip install JPype1-py3 ,需要注意该版本已经被deprecated了,还是手动下载保险。

2、安装java环境后,

找到JRE中的jvm.dll 文件(在JDK中的路径类似如下路径: D:/java/jdk1.8.0_191/jre/bin/server/jvm.dll)

   

二、Python脚本调用

1、依赖包的替换:

如果你的jar包内有import,在自己的idea中查看引用的哪个jar包。在启动JVM的时候,默认不会把JDK "\jre\lib\ext" 扩展包下的JAR包引入,所以为了避免调用过程中出现问题,建议将 "\jre\lib\ext" 内的JAR, 均放入我们自己 "dependency" 目录,自行导入。

在语义分割代码中,我们有对rt.jar的依赖关系。

找到JRE中的rt.jar(在JDK中的路径类似如下路径:D:\\java\\jdk1.8.0_191\\jre\\lib\\rt.jar),复制并替换ocr.jar旁边的dependency文件夹内的rt.jar。

   

2、python脚本

   

from jpype import *

import jpype

import os

#jar包路径

jarpath = os.path.join(os.path.abspath('.'), 'E:\\PYProject\\testocr\\jar\\ocr.jar')

#依赖包路径

# 当有依赖的JAR包存在时,一定要使用-Djava.ext.dirs参数进行引入

dependency = os.path.join(os.path.abspath('.'),

'E:\\PYProject\\testocr\\jar\\rt.jar')

#启动JVM

jpype.startJVM("D:/java/jdk1.8.0_191/jre/bin/server/jvm.dll", "-ea", "-Djava.class.path=%s" % jarpath,

"-Djava.ext.dirs=%s" % dependency)

#获取class实例,注意 package.className替换为自己的包名和类名

JClass = jpype.JClass('hehe.ocr')

instance = JClass()

#调用我的jar包接口

picturePath = "C:\\xxx\\xx\\1.jpg"

serviceUrl = "http://xxxx/xxx/xxxx"

keyPath = "E:\\xxxxx\\key.txt"

#调用方法与java类似,实例.方法名

result = (instance.OcrandSegmentation(picturePath, serviceUrl, keyPath))

print(result)

   

# 程序最后记得最后关闭jvm

jpype.shutdownJVM()

   

3、报错后通常解决方案

1、更新numpy,卸载重装或者 pip -U numpy

   

2、下载正确版本Jpype,卸载重装当前version(第一次装成0.6版 大小只有200K,运行一直报错jpype没有startJVM的函数。卸载重装JPype1-0.7.0版,并更新numpy,启动JVM成功)

   

   

3、JVM无法连续启动。jpype有一个致命弱点在于JVM只能启动一次,且关闭后无法重新启动(内部机制问题)。由于作者这次的目的是将jar包导入后,使用python语言发一个"长期开启且会被重复调用"的服务,临时的解决方法如下:

将启动JVM与jar包类实例化的代码抽取成一个方法,使用python语言的全局变量(global)标志一下JVM的初次启动。再次调用时标志符为true表示已经开启,无需调用。

   

二、ocr.jar包接口介绍

   

调用一个方法,传入三个参数:

@picturePath=图片路径;

@serviceUrl = 服务url(根据服务器的ip变化,修改192.168.0.102部分)

@keyPath =数据字典的存放路径;

返回值:String 四种可能的结果如下:

String ServiceErrorMessage = "--\n" + "第三方服务调用出错" + "\n--\n";

String PictureErrorMessage = "*****";//服务直接识别结果

String FileNotFoundMessage ="****";

String rightMessage = "****"//Hashmap转字符串(格式参考result.txt

   

三、java调用代码如下

   

String picturePath = "1.jpg";

String serviceUrl = "http://xxxxxxx";

String keyPath ="src/key.txt";

String result = null;

result = OcrandSegmentation(picturePath,serviceUrlkeyPath );

   

附:python查看版本

1、命令行 python

2、命令行

>>> import platform

>>> platform.architecture()

windows系统输出是:('64bit', 'WindowsPE')

   

参考:

使用 Python JPype 模块调用 Jar

python官网,下载依赖包

下载python依赖包的另一个链接

   

   

posted @ 2019-11-14 17:16  sub_pixel  阅读(529)  评论(0)    收藏  举报