Jpype调用jar包“Class xx not found“问题

环境

  • Java 1.8 (64位)
  • Python 2.7.9 (32位)
  • Jpype 0.5.4.2
  • Pycharm

代码

import jpype
from jpype import *

# 该目录下有需要调用的jar包 pak.jar
jvmArg = "-Djava.ext.dirs=D:/1_Workspace/jpype_test/"
if not jpype.isJVMStarted():
     jvmPath = jpype.getDefaultJVMPath()
     jpype.startJVM(jvmPath,"-ea", jvmArg)
     # pak.jar中包含类com.abc.EFG
     jd = JClass("com.abc.EFG")
     instance = jd()
     print(instance.getName())
     jpype.shutdownJVM()

问题

执行以上代码,报错如下。Class com.abc.EFG not found
Class com.abc.EFG not found

检查点

1.在pak.jar包中有com.abc.EFG

2.EFG依赖的jar包都在同级目录下

3.Jpype使用没有问题:调用System.out.println可以打印

jprint = java.lang.System.out.println
jprint("xxx") #输出xxx

试着从环境上找原因,也许和Java版本有关。

首先查找pak.jar包的编译jdk版本,方法参见链接:

https://blog.csdn.net/sweettool/article/details/77203193

使用以上方法获得输出是 52,即对应java 1.8,与本机Java版本相符。
但是回头一想其实在Pycharm中并没有配置过Java的版本。

那么打印一下jvmPath,获得的路径是C:\Program Files (x86)\Java\jre6\bin\client\jvm.dll,=> 使用的是 jre1.6(32位)

此时去Java1.8目录找,发现server目录下有jvm.dll,不是在client目录。管他的,尝试直接指定存在的jvm.dll路径。

# ...
# jvmPath = jpype.getDefaultJVMPath()
jvmPath = r'D:\java\jdk1.8\jre\bin\server\jvm.dll'
jpype.startJVM(jvmPath,"-ea", jvmArg)
# ...

到这里也许有人的问题可以解决了,但我的情况是还是报错…

解决

最后装了jdk1.8 32位!!!,发现在client目录下有jvm.dll文件了
再次修改代码,执行通过。
run successfully


总结

过于坑 真神奇

如果你的Matlab自定义函数生成的图像是一个RGB图像,那么在Java中可以将其表示为一个三维数组,即一个MxNx3的数组,其中M和N表示图像的宽度和高度。在Spring Boot后端中,你可以使用Java的ImageIO读取图像数据并将其转换为一个三维数组。假设你的Matlab函数名为`myCustomFunction`,你可以使用以下代码读取图像数据并将其转换为一个三维数组: ```java import java.awt.image.BufferedImage; import java.io.File; import javax.imageio.ImageIO; public class ImageProcessor { public static Object[] processImage(String imagePath) { try { BufferedImage image = ImageIO.read(new File(imagePath)); int width = image.getWidth(); int height = image.getHeight(); int[][][] rgb = new int[width][height][3]; for (int i = 0; i < width; i++) { for (int j = 0; j < height; j++) { int color = image.getRGB(i, j); rgb[i][j][0] = (color >> 16) & 0xff; // Red component rgb[i][j][1] = (color >> 8) & 0xff; // Green component rgb[i][j][2] = color & 0xff; // Blue component } } return new Object[] { rgb }; } catch (Exception e) { // Handle exception } return null; } } ``` 这个函数将读取指定路径的图像,将其转换为一个三维数组,并将其作为一个Object数组返回。在你的Spring Boot应用程序中,你可以调用这个函数并获取图像数据: ```java @RestController @RequestMapping("/image") public class ImageController { @GetMapping("/{imageName}") public ResponseEntity<Object[]> getImageData(@PathVariable String imageName) { String imagePath = "/path/to/images/" + imageName + ".jpg"; Object[] imageData = ImageProcessor.processImage(imagePath); if (imageData != null) { return ResponseEntity.ok().body(imageData); } else { return ResponseEntity.notFound().build(); } } } ``` 这个控制器将接受一个图像名称作为路径变量,并调用`processImage`函数获取图像数据。如果获取成功,它将返回一个包含图像数据的Object数组。如果获取失败,它将返回404状态码。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值