1. 程式人生 > >通過jpype在Python中呼叫java的.jar包

通過jpype在Python中呼叫java的.jar包

關於使用Python中呼叫.jar包,整整耗費了兩天時間,一個坑接一個坑,記錄下來以供參考

步驟如下:

  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