Matlab —— 将m文件打包成jar包 (二)、使用jar包

ゞ 浴缸里的玫瑰 2022-06-18 07:42 1190阅读 0赞

一、准备工作

1、在java工程文件夹(此处即desDesign)下新建lib文件夹,用于存放需引用的jar包:

Center

说明:

因为是matlab打包的jar包,需要依赖matlab中的相关函数,所以要将javabuilder.jar包带上,路径:D:\Program_software\MATLAB_R2014a\toolbox\javabuilder\jar\javabuilder.jar

二、实际使用

1、java工程中导入jar包:

工程文件夹右键——>Build Path——>Config Build Path——>Libraries——>Add Externel JARs——选择jar包所在路径——>确定

Center 1

2、在java文件中import JAR包并创建其中的类:

(1)、java文件导入包:import 包名.*; 此处即:import BIQILibrary.*;

Center 2

(2)、创建包中的类,如上图。注意:

matlab生成的jar包中的类在创建时会可能出错,会抛出MWException异常,即matlab工作异常,所以创建类时必须用try catch。

3、使用包中的类的对象的方法:

(1)、如图。发现每个方法都有对应3个同名方法,每个方法的输入输出参数类型不是与对应的m文件中的function一一对应的,所以不能像matlab中那样直接使用。

Center 3

(2)、查看对应java文件,此处以返回Object[]的getNoiseGrayImg方法为例。打开matlab生成jar包时的fortesting文件夹下的包名文件夹下的对应java文件。如:

Center 4

(3)、用eclipse查看java文件中将使用的方法(此处即返回Objec[] 类型的getNoiseGrayImg)的说明:

先看下对应函数的m文件:

Center 5

对应生成的java文件中的函数:

Center 6

解读:

参数nargout:将返回的参数个数,m文件中返回了一个参数(noiseImg),所以调用时应该写1;

参数rhs:给Matlab函数的输入参数,m文件中定义为4个(srcImg、type、m、v);

函数返回值:一个包含nargout个返回参数的数组,注意为Object类型的数组;

MWException:调用该函数发生错误时的异常。

(4)、具体调用:

Center 7

几点说明:

第1、格式与java文件中说明一致,即返回类型为Object类型数组,里面存了该函数的返回结果;其次,参数列表为:返回值个数(因为matlab函数是可以同时返回多个结果的)、以逗号分隔的输入参数列表;

第2、输入参数必须要是matlab中具有的类型,如:uint8、uint16、double、int16、single。例如我开始使用的rgbImgData数组中的类型为int类型(32bit),运行时便提示了如下错误:

Center 8

将数组rgbImgData声明为short[][][]后,问题解决。short为2字节,相当于matlab中int16。

4、对应返回类型为void,但实际函数有返回值的方法,如上面第3步第(1)条图中的第3个同名方法:void getNoiseGrayImg(Object[] arg0,Object[] arg1),其中参数arg0中存放了接受返回值的变量,arg1中存放了函数的输入参数,如使用此方法可这样调用达到与上面同样的结果:

  1. Object[] outputObj=new Object[1];//此函数只返回一个数据,所以返回列表数组outputObj中只有一个元素
  2. outputObj[0]= outputImg;//outputImg为一个二维int或short型数组,用于实际接受返回图片数据
  3. Object[] inputObj=new Object[4];//函数有四个输入参数
  4. inputObj[0]=rgbImgData;//即第3步中第(4)小步的rgbImgData
  5. inputObj[1]="salt & pepper";
  6. inputObj[2]=0;
  7. inputObj[3]=0.05;
  8. //调用
  9. AlgoBIQI.getNoiseGrayImg(outputObj,inputObj);
  10. //调用后outputObj中的元素将接收到返回值

三、遇到的问题及解决方法

1、问题一:java工程中调用matlab生成的函数时,输入类型必须是matlab中具有的类型

Center 9

分析:使用了int类型(32bit)变量作为输入参数,所以提示此错误

解决方法:

改为short类型(16bit,相当于matlab中int16)或double等。

2、问题二:调用matlab中的rgb2gray函数出现错误

Center 10

分析:因为函数要输入rgb图像的数据,应该对应的是一个3维数组,但我一开始犯了错,直接用了一个存储了灰度值的二维数组作为输入,所以出错

解决方法:

使用三维数组,如:short[][][] rgbImgData=new short[][][3];每一像素点顺序存储R、G、B值。

3、问题三:不是内部或外部命令,也不是可运行的程序或批处理文件

Center 11

分析:首先,svm-scale与svm-predict为exe文件。此提示中包含两个子问题:

子问题一:不是内外部命令,也不是可运行的程序或批处理文件。

分析:jdk配置错误时,cmd输入java回车也会出现此提示,所以认定为需要将svm-scale.exe与svm-predict.exe所在目录配置进环境变量。但实际配置好后,cmd虽然能输入svm-scale与svm-predict回车便提示相关正确信息,但运行工程时还是出现同样错误。

解决方法:

将svm-scale.exe与svm-predict.exe等工程需要调用的程序,直接放在工程根目录下,此处即dspDesign文件夹下。(注:开始是放在自己建的lib文件夹下的)

子问题二:错误使用load 无法读取文件‘output_blur’:没有此类文件或目录

分析:与上一问题相同,都是放置在lib目录下的,所以程序无法直接读取

解决方法:

移到工程根目录下即可。

参考:http://www.ilovematlab.com/archiver/tid-37633.html

发表评论

表情:
评论列表 (有 0 条评论,1190人围观)

还没有评论,来说两句吧...

相关阅读