通过jpype在Python中调用java的.jar包

关于使用Python中调用.jar包,整整耗费了两天时间,一个坑接一个坑,记录下来以供参考

什么是jpype:https://blog.csdn.net/qq_41030861/article/details/79192366

步骤如下:

  1. 准备好要调用的ApiHelper.jar包、以及ApiHelper.jar所有的依赖包
  2. 安装JPype1
  3. 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()

遇到的问题:

  1. 使用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. 具体报错信息如下图:
    通过jpype在Python中调用java的.jar包_第1张图片
    打开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",安装成功!
  2. 安装好JPype1后,运行前面写的脚本,又有新错误,提示“numpy.core.multiarray failed to import”,气哭!错误截图如下:
    通过jpype在Python中调用java的.jar包_第2张图片
    按照网上博客提示在当前项目目录/venv/Lib/site-packages各种卸载安装numpy,依然无效,命令行如下:
    • 卸载:pip uninstall numpy
    • 安装:pip install numpy
    • 更新:python -m pip install -U numpy
      后来直接在File-->Setting-->Project:***-->Project Interpreter-->搜索numpy,安装成功!
  3. 接下来再次运行,又错了!!!提示:jpype._jexception.RuntimeExceptionPyRaisable,错误截图如下:
    通过jpype在Python中调用java的.jar包_第3张图片
    又是一通查找,参考:https://blog.csdn.net/qq_42735170/article/details/81126713 发现我的jar包,解压后路径不对。按照我ApiHelper.jar包里面的截图:通过jpype在Python中调用java的.jar包_第4张图片
    我的ApiHelper.jar包解压出来应该是这样的:在这里插入图片描述
    ApiHelper.class应该在com文件夹下面。但是我的ApiHelper.jar解压出来缺少com这一层,如下图:
    通过jpype在Python中调用java的.jar包_第5张图片
    重新打包APIHelper.jar
  4. 再次运行,又出现新错误: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

你可能感兴趣的:(Python)