网站首页 > 技术文章 正文
之前在公司做框架及全自动化测试工具开发时,需要测试结束后,回传结果及日志到测试平台与云存储平台。但是云存储平台没有相关Python的服务接口开放,而且构造参数时及其复杂,经沟通之前其他类似需求业务是通过Java封装的一个服务方法进行调用上传日志。所以需要后端Java开发打包个jar包,我们只需传指定的几个参数即可,然后使用Python进行方法调用,根据返回结果判断是否上传成功就行。
或者我们在做安卓逆向过程中也会遇到签名算法,但是Python或其他语言又不好还原,只能通过原有Java方法进行调用。接下来以某安卓练习app为例,演示如何进行Java打包及Python调用。
1、IDEA打包Jar包
默认Java工程是正常的,直接说明如何将项目或某个包名打包为Jar
点击菜单栏File,选择Project Structure进入
点击Artifacts,选择“+”号添加JAR,点击“From module with dependencies...”
填写选择需要打包的模块及包信息,最后填写jar输出路径
选择菜单栏Build,点击“Build Artifacts...”,生成Jar文件
Build进度,生成成功
终端模拟调用,检查是否可用
2、Python调用Java方法
前提条件
需要提前安装好Java环境,配置JAVA环境变量 或者 准备好Java环境资源文件,直接使用绝对路径
安装JPype1
pip install jpype1
温馨提示:如果无法通过pip进行安装,需要到官方pypi库(
https://pypi.org/project/JPype1/#files)下载whl包文件,通过pip install whl后缀文件进行安装
调用方法
- 启动JVM
jpype.getDefaultJVMPath()实例化Java虚拟机,这个方法可能会遇到报错,原因就是Java环境没有配置好;如果配置好Java环境及环境变量后还出现报错,采用直接添加路径的方式;在接下来调用的方法中直接写提示缺少的文件路径,如:(我的是macOS,Windows问题少些)
"/jdk8.0.362-macosx_aarch64/zulu-8.jdk/Contents/Home/jre/lib/jli/libjli.dylib"
- 加载jar文件
jpype.startJVM(jpype.getDefaultJVMPath(), "-ea", "-Djava.class.path=./master.jar")
# 或
jpype.startJVM(/jdk8.0.362-macosx_aarch64/zulu-8.jdk/Contents/Home/jre/lib/jli/libjli.dylib, "-ea", "-Djava.class.path=./master.jar")
- 调用函数Class包名指定并实例化类方法
jpype.JPackage("com.yuanrenxue.match2022.fragment.challenge").ChallengeTwoFragment()
- 调用方法并关闭Java虚拟机
ChallengeTwoFragment.sign(data)
jpype.shutdownJVM()
完整调用代码:
import jpype
import requests
import time
def main():
# jpype.startJVM(jpype.getDefaultJVMPath(), "-ea", "-Djava.class.path=./master.jar")
jpype.startJVM("/jdk8.0.362-macosx_aarch64/zulu-8.jdk/Contents/Home/jre/lib/jli/libjli.dylib", "-ea", "-Djava.class.path=./master.jar")
jclass = jpype.JPackage("com.yuanrenxue.match2022.fragment.challenge").ChallengeTwoFragment
ChallengeTwoFragment = jclass(False)
url = 'api接口地址'
for page in range(1, 6):
data = {
"page": page,
"ts": int(time.time())
}
data["sign"] = str(ChallengeTwoFragment.sign(f'{data["page"]}:{data["ts"]}'.encode()))
print(data)
response = requests.post(url, data=data).json()
print(response)
jpype.shutdownJVM()
if __name__ == '__main__':
main()
连续调用sign方法,请求5次,均不相同,说明已经成功
结语
学会欣赏别人,就是尊重自己;学会呵护别人,就是疼爱自己。
猜你喜欢
- 2025-06-24 Python调用Docker API的使用方式(pycharm docker 调试)
- 2025-06-24 青少年Python编程系列28:Python中函数的递归调用
- 2025-06-24 python调用sqlite数据库案例(python 调用数据库)
- 2025-06-24 【Python机器学习系列】基于Flask来构建API调用机器学习模型服务
- 2025-06-24 通过pybind11来实现python调用C++接口(一)
- 2025-06-24 Python编程调用Deepseek API创建智能体
- 2025-06-24 python多装饰器针对函数、类、方法的调用顺序说明
- 2025-06-24 Python Qt GUI设计:Python调用UI文件的两种方法(基础篇—3)
- 2025-06-24 Python | Django 外部脚本调用 models 数据库
- 2025-06-24 自学Python第九天——操作列表(python操作步骤)
- 06-24Python调用Docker API的使用方式(pycharm docker 调试)
- 06-24青少年Python编程系列28:Python中函数的递归调用
- 06-24python调用sqlite数据库案例(python 调用数据库)
- 06-24【Python机器学习系列】基于Flask来构建API调用机器学习模型服务
- 06-24通过pybind11来实现python调用C++接口(一)
- 06-24Python编程调用Deepseek API创建智能体
- 06-24python多装饰器针对函数、类、方法的调用顺序说明
- 06-24Python Qt GUI设计:Python调用UI文件的两种方法(基础篇—3)
- 270℃Python短文,Python中的嵌套条件语句(六)
- 268℃python笔记:for循环嵌套。end=""的作用,图形打印
- 266℃PythonNet:实现Python与.Net代码相互调用!
- 262℃Python实现字符串小写转大写并写入文件
- 261℃Python操作Sqlserver数据库(多库同时异步执行:增删改查)
- 121℃原来2025是完美的平方年,一起探索六种平方的算吧
- 101℃Python 和 JavaScript 终于联姻了!PythonMonkey 要火?
- 95℃Ollama v0.4.5-v0.4.7 更新集合:Ollama Python 库改进、新模型支持
- 最近发表
-
- Python调用Docker API的使用方式(pycharm docker 调试)
- 青少年Python编程系列28:Python中函数的递归调用
- python调用sqlite数据库案例(python 调用数据库)
- 【Python机器学习系列】基于Flask来构建API调用机器学习模型服务
- 通过pybind11来实现python调用C++接口(一)
- Python编程调用Deepseek API创建智能体
- python多装饰器针对函数、类、方法的调用顺序说明
- Python Qt GUI设计:Python调用UI文件的两种方法(基础篇—3)
- Python | Django 外部脚本调用 models 数据库
- 自学Python第九天——操作列表(python操作步骤)
- 标签列表
-
- python中类 (31)
- python 迭代 (34)
- python 小写 (35)
- python怎么输出 (33)
- python 日志 (35)
- python语音 (31)
- python 工程师 (34)
- python3 安装 (31)
- python音乐 (31)
- 安卓 python (32)
- python 小游戏 (32)
- python 安卓 (31)
- python聚类 (34)
- python向量 (31)
- python大全 (31)
- python次方 (33)
- python桌面 (32)
- python总结 (34)
- python浏览器 (32)
- python 请求 (32)
- python 前端 (32)
- python验证码 (33)
- python 题目 (32)
- python 文件写 (33)
- python中的用法 (32)