Python执行Java代码的两种方式

Java环境配置

和执行js代码需要先在本地配好node一样,执行java代码,需要先在本地安装Java

安装步骤可以参考:https://blog.csdn.net/m0_61961937/article/details/122906540

安装好后需要配置系统环境,直接把 \JDK xx.x.x\bin 配进 path 就行

配好后,运行 javajavac 命令,显示如下就表示成功:

image.png

Jpype简介

这里我们使用 jpype 进行调用,pypi的介绍如下:

JPype is a Python module to provide full access to Java from within Python. It allows Python to make use of Java only libraries, exploring and visualization of Java structures, development and testing of Java libraries, scientific computing, and much more. By gaining the best of both worlds using Python for rapid prototyping and Java for strong typed production code, JPype provides a powerful environment for engineering and code development.

This is achieved not through re-implementing Python, as Jython has done, but rather through interfacing at the native level in both virtual machines. This shared memory based approach achieves decent computing performance, while providing the access to the entirety of CPython and Java libraries.

JPype是一个Python模块,在Python中提供对Java的完全访问。它允许Python只利用Java库,探索和可视化Java结构,开发和测试Java库,科学计算,以及更多。通过获得使用Python进行快速原型开发和使用Java进行强类型生产代码的两个世界的最佳效果,JPype为工程和代码开发提供了一个强大的环境。

这不是通过重新实现Python来实现的,就像Jython所做的那样,而是通过在两个虚拟机的原生水平上进行接口。这种基于共享内存的方法实现了体面的计算性能,同时提供了对CPython和Java库的全部访问。

安装方式:pip3 install JPype1,注意包名是 JPype1

  • pypi地址:https://pypi.org/project/JPype1/
  • 官方文档:https://jpype.readthedocs.io/en/latest/
第一种 调用.class文件

首先编译.java文件,打开cmd,使用 javac 命令

javac xxx.java 编译报错:

helloWorld.java:1: 错误: 类 Hello 是公共的, 应在名为 Hello.java 的文件中声明
public class Hello{
^
1 个错误

解决:需要保持文件名类名一致

java打印函数:System.out.println(obj)

编写py脚本调用:

import jpype

jvm_path = jpype.getDefaultJVMPath()
# 启动JVM
jpype.startJVM(jvm_path, "-ea", "-Dfile.encoding=utf-8", convertStrings=True)
# 需要先将 .java 文件编译生成 .class 
JDClass = jpype.JClass("Sign")
# 实例化对象
javaInstance = JDClass()
# 调用JAVA对象的方法
print(javaInstance.sign("page=11652709242".encode()))
# 关闭jvm
jpype.shutdownJVM()
第二种 调用jar包

需要先用 IDEA 将项目打包成jar,然后在项目下新建py文件如下:

import jpype

jvm_path = jpype.getDefaultJVMPath()
# 目标jar包名
jpype.startJVM(jvm_path, "-ea", "-Djava.class.path=unidbg-android.jar")
# 主类所在包名
jclass = jpype.JPackage("com.yrx.app2").ChallengeTwoFragment
# 实例化
ChallengeTwoFragment = jclass(False)
# 调用函数
print(ChallengeTwoFragment.sign("1:1664938752"))

参考文档:

  • https://jingyan.baidu.com/article/adc815134077a9b622bf7355.html
  • https://mp.weixin.qq.com/s/NCAVgqICxDjNIIGeaqs7bA
  • 0
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值