JPype:python脚本调用java对象示例
前置环境
pip install JPype1-py3
验证测试
import jpype
print(jpype.getDefaultJVMPath())
Linux输出JDK下的libjvm.so的路径:./jdk1.8.0_191/jre/lib/amd64/server/libjvm.so
window下对应的是jvm.dll
中间过程出现如下情况:
ImportError: /lib64/libstdc++.so.6: version `GLIBCXX_3.4.20' not found 不存在,通过如下4条命令进行解决:
strings /usr/lib64/libstdc++.so.6 | grep GLIBC
find / -name "libstdc++.so*"
ls -al /usr/lib64/libstdc* 查看软连接详情,将原来低版本软连接进行删除,同时将高版本/usr/lib64/libstdc++.so.6.0.21 重命名为/usr/lib64/libstdc++.so.6.0.20 进行软连接
mv /usr/lib64/libstdc++.so.6.0.21 /usr/lib64/libstdc++.so.6.0.20 && ln -s /usr/lib64/libstdc++.so.6.0.20 /usr/lib64/libstdc++.so.6
实际使用过程:
startJVM("$JAVA_HOME/jre/lib/amd64/server/libjvm.so", "-ea") # 通过jpype.getDefaultJVMPath() 拿到libjvm.so所在的路径
import jpyp
print(jpype.getDefaultJVMPath())
jpype.startJVM(jpype.getDefaultJVMPath(), "-ea")
jpype.java.lang.System.out.println("hello World")
示例DEMO
if __name__ == '__main__':
import jpype
print(jpype.getDefaultJVMPath())
spec_jar = "XXXXX" #XXXXXXXX类所在jar对应的路径
############启动JVM#########################
jarpath = os.path.join(os.path.abspath('.'), spec_jar)
java_home = XXXXX
jre_lib_ext=java_home+"/jre/lib/ext/"
dependency = os.path.join(os.path.abspath('.'), jre_lib_ext)
#默认不会加载jre/lib/ext路径下的jar,所以需要手动添加
jpype.startJVM(jpype.getDefaultJVMPath(), "-ea", "-Djava.class.path=%s" % jarpath,"- Djava.ext.dirs=%s" % dependency)
# 当有依赖的JAR包存在时,一定要使用-Djava.ext.dirs参数进行引入
############实例化Java对象#######################
JClass = jpype.JClass('XXXXXXXX')
instance = JClass()
jpype.java.lang.System.out.println("hello World")