关于使用Python中调用.jar包,整整耗费了两天时间,一个坑接一个坑,记录下来以供参考
什么是jpype:https://blog.youkuaiyun.com/qq_41030861/article/details/79192366
步骤如下:
- 准备好要调用的ApiHelper.jar包、以及ApiHelper.jar所有的依赖包
- 安装
JPype1
- Python中调用ApiHelper.jar包中的方法,具体语法如下:
# -*- coding: utf-8 -*-
import jpype
import os.path
params = {'pageSize': '10', 'page': '1', 'title': '测试', 'type': '1', 'order': '20'}
# 以下三个路径依次:jvm.dll地址、ApiHelper.jar地址、ApiHelper.jar依赖库文件夹地址
jvmPath = jpype.getDefaultJVMPath()
jarPath = os.path.join(os.path.abspath('.'), "E:\\interface_test\\xbsh_app_API\\other_library\\ApiHelper.jar")
dependency = os.path.join(os.path.abspath('.'), "E:\\interface_test\\xbsh_app_API\\other_library")
# startJVM("jvm.dll地址", "-ea", "ApiHelper.jar地址", "ApiHelper.jar依赖库文件夹地址")
# 第四个参数非必填项,有就填,没有就不填
jpype.startJVM(jvmPath, "-ea", "-Djava.class.path=%s" % jarPath, "-Djava.ext.dirs=%s" % dependency)
JDClass = jpype.JClass("com.ApiHelper")
apiHelper = JDClass()
apiHelper.generateEncode_nonStatic("867886021833946", "8764139", "RfXsWDJsNuZjGLur", params)
jpype.shutdownJVM()
遇到的问题:
- 使用pycharm安装
JPype1
,File–>Setting–>Project:***–>Project
Interpreter–>搜索jpype,选合适的版本,点击Install Package
,安装失败。查看失败原因:error: Microsoft Visual C++ 14.0 is required. Get it with “Microsoft Visual C++ Build Tools”: http://landinghub.visualstudio.com/visual-cpp-build-tools … 最后提示要更新You should consider upgrading via the ‘python -m pip install --upgrade pip’ command. 具体报错信息如下图:
打开cmd,按照提示信息执行python -m pip install --upgrade pip
,然后再去安装还是报同样的错误。后来直接在网上找的JPype1-0.6.3-cp36-cp36m-win_amd64.whl包,使用命令行,cd到当前项目venv/Scripts ,然后"pip install JPype1-0.6.3-cp36-cp36m-win_amd64.whl",安装成功!
- 安装好
JPype1
后,运行前面写的脚本,又有新错误,提示“numpy.core.multiarray failed to import”,气哭!错误截图如下:
按照网上博客提示在当前项目目录/venv/Lib/site-packages
各种卸载安装numpy,依然无效,命令行如下:- 卸载:pip uninstall numpy
- 安装:pip install numpy
- 更新:python -m pip install -U numpy
后来直接在File-->Setting-->Project:***-->Project Interpreter-->搜索numpy,安装成功!
- 接下来再次运行,又错了!!!提示:jpype._jexception.RuntimeExceptionPyRaisable,错误截图如下:
又是一通查找,参考:https://blog.youkuaiyun.com/qq_42735170/article/details/81126713 发现我的jar包,解压后路径不对
。按照我ApiHelper.jar包里面的截图:
我的ApiHelper.jar包解压出来应该是这样的:
ApiHelper.class应该在com文件夹下面。但是我的ApiHelper.jar解压出来缺少com这一层,如下图:
重新打包APIHelper.jar - 再次运行,又出现新错误:RuntimeError: No matching overloads found for
generateEncodeData in find 。 意思是找不到generateEncodeData 方法,这次是因为java、Python中 数据类型转换导致的。generateEncodeData方法中有一个参数是要JSONObject类型的,直接把.jar包中的参数改为String类型,然后内部转成JSONObject再使用,自然调用的时候也对应的转为String类型。
【将apiHelper.generateEncode_nonStatic("867886021833946", "8764139", "RfXsWDJsNuZjGLur", params)
改为apiHelper.generateEncode_nonStatic("867886021833946", "8764139", "RfXsWDJsNuZjGLur", str(params))
】
至此问题圆满解决!感谢Android组同事yjLi 、外援zxChen