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代码相关推荐

  1. matlab中调用java代码_Matlab中调用第三方Java代码

    在Java中采用Matlab JA Builder可以实现调用m文件,采用这样的方式,可在Matlab的M文件中,直接调用Java类.这种方式可以表示为Java--> Matlab( m, Ja ...

  2. ruby调用java代码

    为什么80%的码农都做不了架构师?>>>    ruby使用rjb调用java代码 require 'rjb'#加载jar包 Rjb::load(classpath = '/home ...

  3. c 调用java包_C#调用java代码(IKVMC)

    参考资料:https://blog.csdn.net/threadroc/article/details/51406587 参考1:http://www.cnblogs.com/Jack-Blog/p ...

  4. scala调用java代码_scala调用java代码

    scala调用java代码 @(SCALA)[scala] 在scala中调用java代替非常非常简单,直接调用即可 (一)一个简单示例 1.创建一个java类 package com.lujinho ...

  5. scala调用java代码

    scala调用java代码 @(SCALA)[scala] 详细代码请见https://github.com/lujinhong/scalademo 在scala中调用java代替非常非常简单,直接调 ...

  6. python3调用java_Python3-JPype调用Java代码

    原博文 2019-12-31 10:54 − ## JPype调用Java代码 ### 安装所需要的库 ```python pip install JPype1-py3 ``` ### 准备一个jar ...

  7. Python调用Java代码部署及初步使用

    Python调用Java代码部署: jpype下载地址:https://www.lfd.uci.edu/~gohlke/pythonlibs/#jpype 下载的时候需要使用Chrome浏览器进行下载 ...

  8. kotlin 调用java_从Kotlin调用Java代码

    Kotlin代码与Java代码完全兼容. Java代码在Kotlin代码中轻松调用,Kotlin代码也可以通过Java代码的正常方式调用. 从Kotlin调用Java代码 从Kotlin文件调用Jav ...

  9. Mendix敏捷开发零基础学习《三》-高级 (数据删除保护机制、数据关联删除、Security安全、调用外部接口、调用JAVA代码)

    目录 Mendix敏捷开发零基础学习<三> 一. 数据保护机制(Prevention of Delete) 1.业务需求 2.业务分析 3.项目实现 二.Mendix权限(Security ...

  10. python调用java代码方法

    前言: 公司要测试对外接口,接口中的数据又涉及到加密的问题,而python对加密数据进行位运算后,居然无法逆向位运算回来了(应该是个人能力不够吧),只好调用同事之前用的java代码中的函数去解码了,花 ...

最新文章

  1. R语言基于自定义函数构建xgboost模型并使用LIME解释器进行模型预测结果解释:基于训练数据以及模型构建LIME解释器解释一个iris数据样本的预测结果、LIME解释器进行模型预测结果解释并可视化
  2. Puppet之简单安装Nginx
  3. jQuery 里面的排他思想
  4. python 对指定URL获取其子链接
  5. 微信小程序—day02
  6. 兼容多浏览器的CSS背景透明
  7. HTML元素(标签)大全及使用说明 (整)
  8. 入门级XML学习(三)
  9. ORA-07445ORA-00108错误案例
  10. 2023上海大学电气工程及其自动化考研必看上岸经验指导
  11. 荣耀7i android版本,华为荣耀7i有几个版本?荣耀7i不同版本配置介绍
  12. 华为鸿蒙系统卡顿怎么解决,为什么手机卡顿成系统难题?华为推出的鸿蒙系统有望解决...
  13. LSB信息隐藏的卡方分析
  14. 手机端解决2倍图3倍图自适应
  15. 工程数学 傅里叶变换 狄拉克函数
  16. 目标客户画像_分析目标人群画像的5个步骤
  17. 数据治理-数据质量管理
  18. 整数解(韦达定理解法)
  19. android 通知栏授权,Android通知栏权限是否开启
  20. USB 4(USB 4.0)的设计规范(原版)

热门文章

  1. 黑苹果10.13.6安装WebDriver驱动nvidia独立显卡,以及修改机型
  2. 搭建物联网服务器测试环境
  3. journalctl清空日志
  4. windows7系统iis安装不了应该怎么办
  5. 大数据第一季--Hadoop(day10)-徐培成-专题视频课程
  6. Spring事务传播机制详解
  7. matlab模拟晶粒生长,一个有monte caro 模拟晶粒生长的Matlab源程序
  8. buuctf easyweb
  9. 老式计算机如何设置u盘启动,技嘉主板老式bios设置u盘启动教程
  10. Spring开发指南_夏昕 问题总结