python如何调用java类

作者:爱喝马黛茶的安东尼 时间:2022-03-13 16:11:10 

由于 python 本身为脚本语言,且经常存在调用第三方库的情况,有的时候用 java 调用 python 不如用 python 调用 java 方便。下面就整理一下在 python 调用 java 过程中需要哪些操作。(默认是 linux 的 Ubuntu 上调用)

首先 linux 上的 jdk 是一定需要安装的,这个过程在这里就不表了,python 都是 linux 自带的,这里默认是 python2.7。

安装 jpype

python 调用 java 主要是靠在 python 中 import jpype 来实现的。

jpype 的安装极其容易,在 http://jpype.sourceforge.net/ 中下载 JPype-0.5.4.2.zip 并将它放置到随便一个文件夹下,笔者给放到了/home/UsrName/jpype/ 下面,然后在该文件夹下:


unzip Jpype-0.5.4.2.zip
cd Jpype-0.5.4.2
python setup.py install

就安装完成了(如果有报 Permission denied 的错误,请把最后一个指令改为 sudo python setup.py install),此时可在 python 中执行:


#python
>>>import jpype
>>>

Jpype 安装完成。

利用 Jpype 调用 Java

我们就简单调用 java 中自定义函数来举例:

先附上简单的 java 代码,作用是给定字符串返回加工后的字符串,以及给定两个参数返回两数之和。


public class JpypeDemo {

public static String sayHello(String user){ //注意!作为被 python调用的接口函数,需要是静态的,否则 python
 端会报错
   return "hello" + user;
 }
 public static int calc(int a, int b){  //注意!作为被 python 调用的接口函数,需要是静态的,否则 python
 端会报错
   return a + b;
 }
 public static void main(String[] args){
 }
}

将其打包为 jar 文件,这里我将打包好的文件命名为 JpypeDemo.jar(不会打包的小伙伴请百度),并将其放置于 python 脚本所在的目录下。

然后再给出 python 端使用 java 的 jar 包的代码:


import jpype
from jpype import *
import os.path
jarpath = os.path.abspath('.')    #这个函数用来获取当前 python 脚本所在的绝对路径
startJVM("/usr/local/java/jdk1.8.0_181/jre/lib/amd64/server/libjvm.so", "-ea",
"-Djava.class.path=%s" % (jarpath + '/JpypeDemo.jar'))

这个 startJVM 函数作用是加载 Java 虚拟机,其第一个参数必须是你的 Java 的 jdk 的安装位置,每个人的安装位置不一样,我的地址就是上面加粗的那一段(注!!!有的教程上说可以直接通过 getDefaultJVMPath() 函数获取 Java 地址,不建议用!不建议用!不建议用!因为这个函数获得的地址很有可能是电脑自带的 oracle 版的 Java,并非我们自己安装的 Java,这样由于环境变量的问题会导致报错!); 第二个参数意译不明,反正加上就对了 ; 第三个参数是你打包好的 jar 包所在的绝对路径,可以看到我将 JpypeDemo.jar 和前面所得到的当前目录的路径结合起来


JDClass = JClass("JpypeDemo")    #申请一个 Java 类(神奇~)
jd = JDClass
jprint = java.lang.System.out.println #申请 Java 输出类的输出函数
jprint( jd.sayHello(" waw ") )   #调用该类中的 sayHello 函数,并用 Java 输出函数打印 Java 返回值
jprint( jd.calc(2, 4) )    #调用该类中的求和函数,并用 Java 输出函数打印 Java 返回值
#关闭 Java 虚拟机,可写可不写,不写会在程序结束时自动关闭
shutdownJVM()

执行上述程序,得到输出:

hello waw

6

JVM activity report:

classes loaded: 32

JVM has been shutdown

内容扩展:

python调用java的jar包方法


from jpype import *
jvmPath = getDefaultJVMPath()

jars = ["./Firstmaven-1.0-SNAPSHOT-jar-with-dependencies.jar"]jvm_cp = "-Djava.class.path={}".format(":".join(jars))
startJVM(jvmPath,jvm_cp)
sedisObj = JClass("LogBack")
so = sedisObj()
print so.get_v('name0')
print so
print so.get_int()
shutdownJVM()

来源:https://www.py.cn/faq/python/14411.html

标签:python,java类
0
投稿

猜你喜欢

  • C#实现将字符串转换成日期格式的方法

    2021-07-18 06:19:11
  • java8 Stream list to Map key 重复 value合并到Collectio的操作

    2022-02-01 23:53:58
  • Unity3D使用UGUI开发原生虚拟摇杆

    2021-10-04 17:28:26
  • C# Winform实现圆角无锯齿按钮

    2022-08-30 01:11:56
  • 解析Java和Eclipse中加载本地库(.dll文件)的详细说明

    2023-11-11 01:23:31
  • 使用HTTPclient保持长连接

    2023-10-17 12:29:34
  • java中申请不定长度数组ArrayList的方法

    2023-02-24 17:37:37
  • SpringBoot常用数据库开发技术汇总介绍

    2023-11-11 09:39:22
  • Android切换至SurfaceView时闪屏(黑屏闪一下)以及黑屏移动问题的解决方法

    2023-07-21 10:51:45
  • java实现分布式项目搭建的方法

    2022-10-13 10:42:36
  • shiro整合springboot前后端分离

    2022-02-22 10:40:31
  • SpringBoot之使用Redis实现分布式锁(秒杀系统)

    2022-09-30 15:45:08
  • SpringBoot、mybatis返回树结构的数据实现

    2022-05-12 18:56:08
  • 一文搞懂Spring中的注解与反射

    2023-11-11 11:38:18
  • Spring AOP实现记录操作日志

    2022-06-04 06:03:53
  • Tomcat 实现WebSocket详细介绍

    2023-08-12 21:22:11
  • Java基础教程之数组的定义与使用

    2022-04-24 10:24:12
  • Spring实战之使用ClassPathResource加载xml资源示例

    2023-11-28 23:00:30
  • springsecurity 企业微信登入的实现示例

    2023-06-16 16:39:35
  • SpringBoot集成JmsTemplate(队列模式和主题模式)及xml和JavaConfig配置详解

    2022-01-31 05:29:10
  • asp之家 软件编程 m.aspxhome.com