python调用具备加载dll功能的java时UnsatisfiedLinkError:或者python加载dll失败

背景

详情见如下:
我有一段通过python调用java api的代码,该代码诡异的地方在于,当我import第三方包时,就会导致异常,如果没有引入第三方包,则可以正常运行。
代码类似如此:

import jpype
import xlwt # 这一步注释与否会决定是否报错

if name == “main”:
jars = “D:\MyJar.jar”
jvm_path = jpype.getDefaultJVMPath()
jvm_cp = “-Djava.class.path={}”.format(jars))

if not jpype.isJVMStarted():
                startJVM(jvm_path, jvm_cp)

                JCls = jpype.JPackage('package_name').class_name
                Jcls = JCls()
                jcls.open_service()  # 报错的地方,因为这个接口会加载C的dll库。

其中关键的地方在于,java api会去load一个.dll文件。如果没有import xlwt这一步,那么dll是可以正常加载成功,且接口可以正常调用。但是如果有import xlwt这一步,那么java load dll的功能就会抛出异常,报找不到应用程序。
import xlwt只是一个举例,根据测试,导入其他第三方包,并且包的__init__.py中有import其他模块的指令,都会导致这种情况出现。
报错信息类似:
java.lang.UnsatisfiedLinkError: Unable to load library ‘dllName’:
Native library (win32-x86/dllName.dll) not found in resource path
([file:/C:/Program%20Files%20(x86)/Java/jdk1.8.0_171/jre/lib/charsets.jar,

解决方法:

笔者工作环境中的python版本是3.7.3。经过安装多个版本发现,至少大于3.7.3的python版本,在D:\Python3.7\DLLs中都有如下动态库,libcrypto-1_1-x64.dll(64位python),libcrypto-1_1.dll(32位python)。
在python3.6中是没有这个动态库的。如果通过python加载dll时,即使是在python环境中通过别的语言加载dll。当遇到上述问题,那么考虑上述动态库是罪魁祸首。
因为被加载的动态库依赖正确匹配版本的该动态库,所以如果python环境中的该动态库版本相对被加载动态库来说不合适,那么就会导致加载dll失败。解决方法是找到匹配版本的动态库,然后替换掉。一般可以从被加载库的依赖库中找到该动态库的正确匹配版本。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值