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失败。解决方法是找到匹配版本的动态库,然后替换掉。一般可以从被加载库的依赖库中找到该动态库的正确匹配版本。

### OpenCV Java集成教程 #### 1. 获取OpenCV源码 可以通过克隆OpenCV的Git仓库来获取其源代码。如果计划使用Java绑定功能,则需要安装JDK(建议使用Oracle/Sun JDK 6或7)、Apache Ant以及Python v2.6或更高版本[^1]。 #### 2. 加载OpenCV动态链接库 在运行基于OpenCV的Java程序之前,必须加载对应的DLL文件。可以采用如下方式实现: ```java try { String openCVDllName = "D:\\Java\\opencv\\build\\java\\x64\\opencv_java452.dll"; System.load(openCVDllName); } catch (SecurityException e) { System.out.println(e.toString()); System.exit(-1); } catch (UnsatisfiedLinkError e) { System.out.println(e.toString()); System.exit(-1); } ``` 上述代码片段展示了如何通过指定路径手动加载`opencv_java452.dll`文件[^2]。需要注意的是,在实际项目中应根据具体环境DLL路径。 #### 3. 使用Maven管理依赖项 对于现代Java项目而言,推荐利用Maven简化依赖管理过程。可以在项目的`pom.xml`文件中加入以下配置以引入OpenCV库支持: ```xml <dependency> <groupId>org.openpnp</groupId> <artifactId>opencv</artifactId> <version>4.5.2-20210218.094312-107</version> </dependency> ``` 此方法不仅能够自动下载所需jar包及其附属资源,还免去了手动设置本地路径的工作量。 #### 4. 编写简单的图像读取与显示示例 下面给出一段完整的例子用于演示基本的功能调用流程——从磁盘加载图片并将其展示出来: ```java import org.opencv.core.Core; import org.opencv.core.Mat; import org.opencv.imgcodecs.Imgcodecs; import org.opencv.highgui.HighGui; public class SimpleImageDisplay { static{ // 动态加载dll或者so文件 try { System.loadLibrary(Core.NATIVE_LIBRARY_NAME); }catch(Exception ex){ ex.printStackTrace(); } } public static void main(String[] args) throws Exception { Mat image = Imgcodecs.imread("path/to/your/image.jpg"); if(image.empty()){ throw new IllegalArgumentException("Cannot read the specified file."); } HighGui.imshow("Test Window",image); while(true){ char keypress=(char)HighGui.waitKey(10); if(keypress=='q'||keypress==27){break;} } System.out.println("Program terminated successfully!"); } } ``` 以上代码实现了打开一张JPEG格式的照片,并在一个窗口里呈现它直到用户按下键盘上的'Q'键或ESC退出循环为止[^3]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值