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

第一种 调用.class文件

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

javac xxx.java 编译报错:

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

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

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

编写py脚本调用:

1
2
3
4
5
6
7
8
9
10
11
12
13
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文件如下:

1
2
3
4
5
6
7
8
9
10
11
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"))

参考文档: