通过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. 具体报错信息如下图:
    在这里插入图片描述
    打开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”,气哭!错误截图如下:
    在这里插入图片描述
    按照网上博客提示在当前项目目录/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,错误截图如下:
    在这里插入图片描述
    又是一通查找,参考:https://blog.csdn.net/qq_42735170/article/details/81126713 发现我的jar包,解压后路径不对。按照我ApiHelper.jar包里面的截图:在这里插入图片描述
    我的ApiHelper.jar包解压出来应该是这样的:在这里插入图片描述
    ApiHelper.class应该在com文件夹下面。但是我的ApiHelper.jar解压出来缺少com这一层,如下图:
    在这里插入图片描述
    重新打包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

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
org.python.util.PythonInterpreter Jython是一种完整的语言,而不是一个Java翻译器或仅仅是一个Python编译器,它是一个Python语言在Java的完全实现。Jython也有很多从CPython继承的模块库。最有趣的事情是Jython不像CPython或其他任何高级语言,它提供了对其实现语言的一切存取。所以Jython不仅给你提供了Python的库,同时也提供了所有的Java类。这使其有一个巨大的资源库。   Jython和Python强调了代码的简明性、方便性和易读性。Jython使用缩排来对代码块定界以避免使用在Java的大括号。Jython用新的一行来表示一个新的语句的开始,并有几个重要的区别,如允许在每个语句后省略分号。Jython没有像在Java的public、private和protected存取符,这样就给程序员提供了快速开发所需要的灵活性,并将注意力集在程序逻辑上。正像前面所提到的,Jython不用明显的静态的类型定义,故程序员不需要从程序逻辑转移到类型定义上来.   Jython的历史要追溯到JimHugunin,他是Guidovan Rossum在国家研究动力心(CNRI)的同事。JimHugunin认识到Python编程语言用Java实现的重要性,并实现了最初名为JPython的语言。由于要开发aspectj(http://aspectj.org/),JimHugunin不能继续致力于JPython了。所以当Python的开发者准备离开CNRI时,由当时也在CNRI的Barry Warsaw继续领导开发。   Python和Jython项目组从CNRI离开后,在Sourceforge上转变为一种更开放的语言模型。在此期间,一个对Jython(JPython)做了主要贡献的人FinnBock领导了Jython项目小组。正是由于FinnBock所做的杰出贡献使Jython现在成为一个如此有价值的工具。类似Jython这样的开放源代码项目与开发和维护它们的人一样杰出,从这个意义上说Jython因为有FinnBack的贡献和指导而很幸运。另外一个对Jython做了最新有价值贡献的人是SamuelePedroni。Samuele的贡献主要在Jython的类装载、导入机制等等。Finn和Samuele目前是Jython的两个主要开发者。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值