一、what's the JPype

  JPype 是一个能够让 python 代码方便地调用 Java 代码的工具。在某些时候 java 的能力更强,我们可以用 java 写一个模块的功能然后用 Python 去调用。当然相应的也可以反着来,Java 使用 jython 调用Python

JPype与Jython(JPython后继者)的区别?

  • 运行环境不同:jython 运行在 jvm 上,而JPype 的实际运行环境仍然是 python runtime,只是在运行期间启动了一个嵌入的jvm;
  • 使用者不同:jython 用于 Java ,JPype 用于 Python。

JPype安装

  本人尝试过直接使用 pip3 install JPype1-py3 的形式,但貌似这样安装的版本不是很好,建议使用 wheel 进行安装

下载地址:https://www.lfd.uci.edu/~gohlke/pythonlibs/

  在网页中找到 jpype,我使用的版本是 Python3,下载的 wheel 是 JPype1‑0.6.3‑cp36‑cp36m‑win_amd64.whl

pip install xxx.wheel
pip install numpy # jpype 依赖于 numpy

二、Java 的安装及 IDE 的安装

  最好是 jar 文件在本地打包,本地开发,所以需要有 Java 的环境。不需要安装的自行跳过。

注意:Python 和JDK 版本需要一致,比如都是 64 bit

配置 Java 环境

  1. 下载 JDK 文件版,本要大于1.7,官网:http://www.oracle.com/,然后傻瓜式安装
  2. 配置系统变量 JAVA_HOME:变量名 JAVA_HOME,值为 jdk 所在目录
  3. 配置系统变量 CLASSPATH:变量名 CLASSPATH,值为 ;%JAVA_HOME%\lib;%JAVA_HOME%\lib\dt.jar;%JAVA_HOME%\lib\tools.jar
  4. 配置环境变量 PATH:%JAVA__HOME%\bin;%JAVA_HOME%\jre\bin
  5. cmd 中输入 java -version 能看到版本号就说明 OK 了

安装 IDE

  • 下载 eclipse,官网:http://www.eclipse.org/downloads/
  • 下载完成后,打开,File→new→java project,取消默认勾选的项目,点击finish
  • 右键src,new→class,输出name,写一个 Java 的小脚本(演示的脚本文件命名为 JpypeDemo.java)
    public class JpypeDemo {
    public int calc(int a, int b) {
    return a+b;
    } public static void main(String[]args) {
    JpypeDemo JpypeDemo = new JpypeDemo();
    int a =JpypeDemo.calc(1,2);
    System.out.print(a);
    }
    }

将 Java 脚本打包成 jar 包

  1. 将 Java 脚本编译成 class 文件

    javac JpypeDemo.java # 会生成一个class文件
  2. 打包成 jar 包
    jar cf Demo.jar JpypeDemo.class

使用 JPype

import jpype
import os JVM_path = r"C:\Program Files\Java\jdk1.8.0_221\jre\bin\server\jvm.dll" # jvm.dll 是必须的,在jdk文件夹jre\bin\server\jvm.dll下
jarpath =r'C:\Users\zhuminghui\Desktop\demo_test\Demo.jar' # 生成的 jar 包路径 Djava = "-Djava.class.path="+jarpath
jpype.startJVM(JVM_path,"-ea",Djava)
jpype.java.lang.System.out.println("HelloWorld") # 测试调用 Java 的环境 print
JDClass =jpype.JClass("JpypeDemo") # jar 包中,Java 脚本中定义的类
jd = JDClass() # 实例化
print(jd.calc(1,2)) # 调用方法
# 关闭JVM
jpype.shutdownJVM()

注意:jvm 只能启动一次,关闭一次,否则会报错。

坑点记录

如果 Java 脚本第一行声明了 package,在调用 JClass 实例化的时候需要做下更改

package aaa
public class JpypeDemo {
public int calc(int a, int b) {
return a+b;
} public static void main(String[]args) {
JpypeDemo JpypeDemo = new JpypeDemo();
int a =JpypeDemo.calc(1,2);
System.out.print(a);
}
}
import jpype
import os JVM_path = r"C:\Program Files\Java\jdk1.8.0_221\jre\bin\server\jvm.dll" # jvm.dll 是必须的,在jdk文件夹jre\bin\server\jvm.dll下
jarpath =r'C:\Users\zhuminghui\Desktop\demo_test\Demo.jar' # 生成的 jar 包路径 Djava = "-Djava.class.path="+jarpath
jpype.startJVM(JVM_path,"-ea",Djava)
jpype.java.lang.System.out.println("HelloWorld") # 测试调用 Java 的环境 print
JDClass =jpype.JClass("aaa.JpypeDemo") # jar 包中,Java 脚本中定义的类
jd = JDClass() # 实例化
print(jd.calc(1,2)) # 调用方法
# 关闭JVM
jpype.shutdownJVM()

使用 jpype 库实现 Python 调用 java 的 jar 包中的功能的更多相关文章

  1. (转)java 从jar包中读取资源文件

    (转)java 从jar包中读取资源文件 博客分类: java   源自:http://blog.csdn.net/b_h_l/article/details/7767829 在代码中读取一些资源文件 ...

  2. java 执行 jar 包中的 main 方法

    java 执行 jar 包中的 main 方法 通过 OneJar 或 Maven 打包后 jar 文件,用命令: java -jar ****.jar执行后总是运行指定的主方法,如果 jar 中有多 ...

  3. Python3.5调用Java的jar包

    声明:这个是在一个博客上看到的,过了俩星期了突然找不到原博客了,如果原来的博主看到,请联系我删除~ 主要是怕自己忘记,所以在此记录: 环境 Python3.5+JDK1.8 安装命令:python3 ...

  4. PHP通过php-java-bridge调用JAVA的jar包里class类

    正 文:   有的时候我们需要在PHP里调用JAVA平台封装好的jar包里的class类和方法,一般飘易推荐的做法是采用php-java-bridge做桥接,本文就来介绍一下大致的实现方法. 先简单说 ...

  5. jmeter接口测试-调用java的jar包-csv参数化请求-BeanShellPreProcessor生成验签作为请求验证参数-中文乱码----实战

    背景及思路: 需求:要做 创建新卡 接口的测试,要求: 1. 不需要每次手动修改请求参数. 方案:文中先用excle将数据准备好,导出为csv格式,再用jmeter的csv请求进行参数化 2. 卡号需 ...

  6. java 从jar包中读取资源文件

    在代码中读取一些资源文件(比如图片,音乐,文本等等),在集成环境(Eclipse)中运行的时候没有问题.但当打包成一个可执行的jar包(将资源文件一并打包)以后,这些资源文件找不到,如下代码: Jav ...

  7. java读取jar包中的文件

    随手写了一个java小工具,maven打包成功后,发现工具总是读不到打在jar包中的文件信息,要读取的文件位于 /src/main/resources 目录下,打包成功后,文件就在jar包中根目录下, ...

  8. python - jpype模块,python调用java的接口

    转载自: http://www.cnblogs.com/junrong624/p/5278457.html https://www.cnblogs.com/fanghao/p/7745356.html ...

  9. C++调用Java的Jar包

    一个简单需求:用C++调用Jar包. 实现基本思路:调用CreateProcess API来启动cmd.exe执行jar包. 调用类CJarAppCall. JarAppCall.h #pragma ...

随机推荐

  1. iwlist/iwconfig/iw命令

    1.iwlist 命令:用于对/proc/net/wireless文件进行分析,得出无线网卡相关信息 # iwlist wlan0 scanning 搜索当前无线网络 # iwlist wlan0 f ...

  2. spi调试步骤,mcp2515调试整理

    1.先查看也硬件电路,一般都是单片机作为master,其他芯片作为slave.单片机的MOSI对应从机的SI,单片机的MISO对应从机的SO,如果两个引脚接反了,那是怎么调试都没有效果的. 2.单片机 ...

  3. brew 又叫Homebrew,是Mac OSX上的软件包管理工具

    brew 又叫Homebrew,是Mac OSX上的软件包管理工具; Homebrew是一款Mac OS平台下的软件包管理工具,拥有安装.卸载.更新.查看.搜索等很多实用的功能.简单的一条指令,就可以 ...

  4. LeetCode 953. Verifying an Alien Dictionary

    原题链接在这里:https://leetcode.com/problems/verifying-an-alien-dictionary/ 题目: In an alien language, surpr ...

  5. RPM包——查询

    1.rpm -q (1)    查询是否已经安装某一个rpm包: 例如:rpm -q httpd (2)-qa:查询所有的已经安装的包: 2.查询软件包的详细信息: rpm -qi -i :查询软件包 ...

  6. 一些开源的dashboard 解决方案

    简单收集了以下开源dashboard 的项目,记录下 plotly-dash 基于python 的dash 开发工具,很不错 项目地址 https://github.com/plotly/dash k ...

  7. React渲染和事件处理

    一.列表渲染 ①在列表中,绑定数组成员会直接把成员渲染 <div id="app"></div> <script src="node_mod ...

  8. 【JZOJ6231】【20190625】等你哈苏德

    题目 有\(m\)条线段,每条线段为\([l_i,r_i]\),每条线段可以是黑/白色 有些线段已经被染色,有些需要被确定颜色 询问是否存在一种染色方案,使得对于每一个位置\(i\),覆盖它的线段黑白 ...

  9. exlucas易错反思

    模板和题解 复习了一下 exlucas的模板,结果写挂四次(都没脸说自己以前写过 是该好好反思一下呢~ 错的原因如下: 第一次WA:求阶乘的时候忘了递归处理(n/p)! 第二次WA:求阶乘时把p当成循 ...

  10. 【luoguP4720】【模板】扩展卢卡斯

    快速阶乘与(扩展)卢卡斯定理 \(p\)为质数时 考虑 \(n!~mod~p\) 的性质 当\(n>>p\)时,不妨将\(n!\)中的因子\(p\)提出来 \(n!\) 可以写成 \(a* ...