通過jpype在Python中呼叫java的.jar包
阿新 • • 發佈:2019-02-14
關於使用Python中呼叫.jar包,整整耗費了兩天時間,一個坑接一個坑,記錄下來以供參考
步驟如下:
- 準備好要呼叫的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
- 解除安裝:pip uninstall numpy
- 安裝:pip install numpy
- 更新:python -m pip install -U numpy
後來直接在File-->Setting-->Project:***-->Project Interpreter-->搜尋numpy,安裝成功!
- 接下來再次執行,又錯了!!!提示: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 - 再次執行,又出現新錯誤: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