python_jpype1 调用java代码
python 调用 java代码有多种方式,暂且说一下使用jpype类库进行python对java代码的使用
一. 环境配置
S1:先查看当前电脑python的版本,我的是python 64位
S2: 安装 Jpype1 类库
我本地pip install jpype1 的时候报错,所以本次通过下载 jpype1的离线安装包进行安装
jpype1下载地址:https://www.lfd.uci.edu/~gohlke/pythonlibs/#jpype,
下载成功之后pip进行安装:pip install JPype1‑1.0.2‑cp37‑cp37m‑win32-amd64.whl
备注:1.选择与自己python相匹配的进行下载
(比如:我的python是37就选择cp37,命名中带有amd64是适应python64位的,没有amd64的是适应python32位的,所以下载:JPype1‑1.0.2‑cp37‑cp37m‑win32-amd64.whl )
2.如果安装失败,请先安装wheel,才能安装whl离心安装包:pip install wheel
S3: java的jre虚拟环境
python运行java代码,需要启用java的jre虚拟环境,这个jre虚拟环境依赖于 jvm.dll。所以我们需要拿到jvm.dll的路径用于后续的python代码。
第一种情况:如果本地安装了jdk,并且版本也是64位,也设置了java_home 的环境变量,这一步可以直接跳过。
第二种情况:下载 jre,找到相关的jvm.dll 路径。
jre下载地址:http://www.oracle.com/technetwork/java/javase/downloads/jre8-downloads-2133155.html
备注:安装jre 要与python版本位数保持一致
S4: 准备java的 jar包:编写java项目,发版生成 jar包。比如:pythonCall.jar
二. 代码实现
def demo():
'''
python 调用 java代码的demo
'''
# 获取环境变量的jvm.dll 路径,
# 从下载的jre中获取jvm.dll:jvmPath = C:\a_Python\AAA\calljavaproject\jre\XX\jvm.dll
jvmPath = jpype.getDefaultJVMPath()
# 启动java的jvm虚拟环境
jpype.startJVM(jvmPath)
# 模拟java的代码,打印 字符串
jpype.java.lang.System.out.println("hello world!")
# 关闭java虚拟环境
jpype.shutdownJVM()
因为我代码多出的case用到java的加密,所以多次调用的时候报错:JVM is already started 或者 JVM cannot be restarted,所以修改代码如下:
def start_jvm(self, sysname=""):
try:
# 如果 jvm环境已经启动,则直接返回成功;如没有启动,则进入else,开启java的虚拟环境
if jpype.isJVMStarted():
return True
else:
# 启动java的jvm
# S1: 加载 java的jar包(java程序的打包)
jarpath = os.path.join(JAVA_JAR_PATH, "pythonCall.jar")
# S2: 开启 jvm 虚拟环境
jpype.startJVM(self.jvmpath, "-Djava.class.path=" + jarpath)
return True
except Exception as e:
log.error(sysname + "系统启动java的jvm虚拟环境出现错误,错误原因:" + str(e))
return False
具体代码如下:
import os
import jpypefrom common.util.logHelper import logclass CallJava():def __init__(self):# 获取 jvm.dll 路径:使用环境变量self.jvmpath = jpype.getDefaultJVMPath()def start_jvm(self, sysname=""):try:# 如果已经启动jvm的虚拟环境则跳过;否则进入else,启动java的虚拟环境if jpype.isJVMStarted():return Trueelse:# 启动java的jvm# S1: 加载 java的jar包(java程序的打包)jarpath = os.path.join(JAVA_JAR_PATH, "pythonCall.jar")# S2: 开启 jvm 虚拟环境jpype.startJVM(self.jvmpath, "-Djava.class.path=" + jarpath)return Trueexcept Exception as e:log.error(sysname + "系统启动java的jvm虚拟环境出现错误,错误原因:" + str(e))return Falsedef java_encrypt(self, sysname, body, keys):"""加密方法: des(key).encrypt("system=sysname(系统名),time=body(当前时间)")注意:调用java方法,由于我写的是静态方法,直接使用类名就可以调用方法;如果不是静态,需要先初始化类,在调用类方法。sysname: "系统名"body:"待加密内容"keys:"密钥""""response = ""try:if self.start_jvm(sysname):# S3: 加载 java 内相关的类文件(参数是java内的长类名)javaclass = jpype.JClass("com.pythoncalljava.JavaClass")# 加密方法:javaClass.encrypt("系统名", "明文", "密钥")response = str(javaclass.encrypt(sysname, body, keys))except Exception as e:log.error(sysname + "系统调用java加密方法出错,错误原因:" + str(e))return responsedef java_encrypt_accesssecret(self, sysname, body, accesssecret, key):"""加密方法: 加密后的内容 = des(key).encrypt(system=sysname,time=body,accessSecret=accessSecret)sysname: "系统名"body:"待加密内容"keys:"密钥"accesssecret: "访问密码""""response = ""try:if self.start_jvm(sysname):javaclass = jpype.JClass("com.pythoncalljava.SignJavaClass")response = str(javaclass.encrypt(sysname, body, accesssecret, key))except Exception as e:log.error(sysname + "系统调用java加密方法出错,错误原因:" + str(e))return responsedef java_decrypt(self, sysname, keys, encrypt_body):"""解密: des(秘钥).decrypt(encrypt_body(加密的报文))keys:"密钥"encrypt_body:"加密内容""""response = ""try:if self.start_jvm(sysname):javaclass = jpype.JClass("com.pythoncalljava.JavaClass")# 解密方法:javaClass.decrypt("密钥","加密内容")response = javaclass.decrypt(keys, encrypt_body)except Exception as e:log.error(sysname + "系统调用java解密方法出错,错误原因:" + str(e))return responsedef java_decrypt_accesssecret(self, sysname, keys, encrypt_body):"""解密: des(秘钥).decrypt(encrypt_body(加密的报文))keys:"密钥"encrypt_body:"加密内容""""response = ""try:if self.start_jvm(sysname):javaclass = jpype.JClass("com.pythoncalljava.SignJavaClass")# 解密方法:javaClass.decrypt("密钥","加密内容")response = javaclass.decrypt(keys, encrypt_body)except Exception as e:log.error(sysname + "系统调用java解密方法出错,错误原因:" + str(e))return responsedef shutdown_java_jvm(self):"""关闭java虚拟环境"""try:if self.start_jvm():jpype.shutdownJVM()except Exception as e:log.error("关闭java的jvm虚拟环境出错,错误原因:" + str(e))return False
python_jpype1 调用java代码相关推荐
- matlab中调用java代码_Matlab中调用第三方Java代码
在Java中采用Matlab JA Builder可以实现调用m文件,采用这样的方式,可在Matlab的M文件中,直接调用Java类.这种方式可以表示为Java--> Matlab( m, Ja ...
- ruby调用java代码
为什么80%的码农都做不了架构师?>>> ruby使用rjb调用java代码 require 'rjb'#加载jar包 Rjb::load(classpath = '/home ...
- c 调用java包_C#调用java代码(IKVMC)
参考资料:https://blog.csdn.net/threadroc/article/details/51406587 参考1:http://www.cnblogs.com/Jack-Blog/p ...
- scala调用java代码_scala调用java代码
scala调用java代码 @(SCALA)[scala] 在scala中调用java代替非常非常简单,直接调用即可 (一)一个简单示例 1.创建一个java类 package com.lujinho ...
- scala调用java代码
scala调用java代码 @(SCALA)[scala] 详细代码请见https://github.com/lujinhong/scalademo 在scala中调用java代替非常非常简单,直接调 ...
- python3调用java_Python3-JPype调用Java代码
原博文 2019-12-31 10:54 − ## JPype调用Java代码 ### 安装所需要的库 ```python pip install JPype1-py3 ``` ### 准备一个jar ...
- Python调用Java代码部署及初步使用
Python调用Java代码部署: jpype下载地址:https://www.lfd.uci.edu/~gohlke/pythonlibs/#jpype 下载的时候需要使用Chrome浏览器进行下载 ...
- kotlin 调用java_从Kotlin调用Java代码
Kotlin代码与Java代码完全兼容. Java代码在Kotlin代码中轻松调用,Kotlin代码也可以通过Java代码的正常方式调用. 从Kotlin调用Java代码 从Kotlin文件调用Jav ...
- Mendix敏捷开发零基础学习《三》-高级 (数据删除保护机制、数据关联删除、Security安全、调用外部接口、调用JAVA代码)
目录 Mendix敏捷开发零基础学习<三> 一. 数据保护机制(Prevention of Delete) 1.业务需求 2.业务分析 3.项目实现 二.Mendix权限(Security ...
- python调用java代码方法
前言: 公司要测试对外接口,接口中的数据又涉及到加密的问题,而python对加密数据进行位运算后,居然无法逆向位运算回来了(应该是个人能力不够吧),只好调用同事之前用的java代码中的函数去解码了,花 ...
最新文章
- R语言基于自定义函数构建xgboost模型并使用LIME解释器进行模型预测结果解释:基于训练数据以及模型构建LIME解释器解释一个iris数据样本的预测结果、LIME解释器进行模型预测结果解释并可视化
- Puppet之简单安装Nginx
- jQuery 里面的排他思想
- python 对指定URL获取其子链接
- 微信小程序—day02
- 兼容多浏览器的CSS背景透明
- HTML元素(标签)大全及使用说明 (整)
- 入门级XML学习(三)
- ORA-07445ORA-00108错误案例
- 2023上海大学电气工程及其自动化考研必看上岸经验指导
- 荣耀7i android版本,华为荣耀7i有几个版本?荣耀7i不同版本配置介绍
- 华为鸿蒙系统卡顿怎么解决,为什么手机卡顿成系统难题?华为推出的鸿蒙系统有望解决...
- LSB信息隐藏的卡方分析
- 手机端解决2倍图3倍图自适应
- 工程数学 傅里叶变换 狄拉克函数
- 目标客户画像_分析目标人群画像的5个步骤
- 数据治理-数据质量管理
- 整数解(韦达定理解法)
- android 通知栏授权,Android通知栏权限是否开启
- USB 4(USB 4.0)的设计规范(原版)