一直以为这样的情况不会出现,但它还是出现了:一段 Java 代码+引用 Jar 包,一段 Python 代码要使用 Java 代码中某个方法。本来想用 Python 重新实现一遍,又觉得这简直是浪费时间,何不直接在 Python 代码中使用 Java 代码的该方法呢?应该特别简单,分分钟搞定的事情,结果还是掉坑里了,特此记录,以备后查。
首先,进一步明确下需求。为了方便,将实际的例子替换为一个比较简单的例子来记录说明;另外,实际也不使用 IDE,就是个简单的脚本任务。
来咯,Java 的代码:
1 | // Encoder.java |
这里的 net.iharder.Base64
是一个 jar 包,编译后执行:
1 | javac -cp base64-2.3.9.jar:. Encoder.java |
现在,假设有一段 Python 代码需要调用上面 encode
方法。
5 Ways of Calling Java from Python 这里介绍了 5 种方法:
- jpype-project/jpype: JPype is cross language bridge to allow python programs full access to java class libraries.
- bartdag/py4j: Py4J enables Python programs to dynamically access arbitrary Java objects
- CellProfiler/python-javabridge: Python wrapper for the Java Native Interface
- JCC · PyPI
- kivy/pyjnius: Access Java classes from Python
简单瞅了眼,发现前两个无论从 API、维护还是适用方面都优于后面的,这里以 jpype
为例说明。
具体的,有两种方式,一种直接调用编译后的 class
文件:
1 | import jpype |
此时目录如下:
1 | ├── Encoder.class |
或者直接使用 jar 包:
1 | jar cvf Encoder.jar Encoder.class |
代码如下:
1 | import jpype |
此时目录如下:
1 | ├── Encoder.class |
只使用两个 jar 文件即可。
另外,如果需要切换 java 版本,可以使用如下命令:
1 | sudo update-alternatives --config javac |
参考资料