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

时间:2022-11-10 09:40:18

一、准备工作

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

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

说明:

因为是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包所在路径——>确定

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


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

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

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

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

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


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

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

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

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

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

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

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

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

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

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

解读:

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

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

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

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

(4)、具体调用:

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

几点说明:

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

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

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

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


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

Object[] outputObj=new Object[1];//此函数只返回一个数据,所以返回列表数组outputObj中只有一个元素
outputObj[0]= outputImg;//outputImg为一个二维int或short型数组,用于实际接受返回图片数据

Object[] inputObj=new Object[4];//函数有四个输入参数
inputObj[0]=rgbImgData;//即第3步中第(4)小步的rgbImgData
inputObj[1]="salt & pepper";
inputObj[2]=0;
inputObj[3]=0.05;

//调用
AlgoBIQI.getNoiseGrayImg(outputObj,inputObj);
//调用后outputObj中的元素将接收到返回值


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


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

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

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

解决方法:

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


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

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

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

解决方法:

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


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

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

分析:首先,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