本博客轉(zhuǎn)載自http://blog.csdn.net/wengdada/article/details/52017274
主要過程:利用MATLAB的Compiler工具將MATLAB函數(shù)編譯成.jar文件,在Eclipse中實現(xiàn)對.jar文件中函數(shù)的調(diào)用议双,以此實現(xiàn)MATLAB和JAVA的混合編程。
1.環(huán)境配置要求:運行機器上必須裝有JRE并且版本要和MatLab(Matlab這里用的是2016b版本)自帶的JRE版本保持一致掸犬。在Matlabd的Command Windows中輸入【version -java】以及打開cmd 分別輸入命令【java -version】和【javac -version】分別驗證編譯和運行版本。
2.在Matlab中新建一個函數(shù)文件绪爸,編寫需打包成.jar到的Matlab函數(shù)并保存湾碎,這里以一個rgbtogray()函數(shù)為例。
代碼如下:
%函數(shù)功能:rgbtogray()這個函數(shù)將D:\matlab_java_test\目錄下的所有.jpg文件轉(zhuǎn)化為灰度圖奠货,
%并且顯示出來介褥,之后將得到的灰度圖改名存放在原來的目錄下
%status:函數(shù)返回值,若成功處理圖片递惋,放回SUCCESS;
%file_path:輸入?yún)?shù)柔滔,要處理的圖片所在的路徑
img_path_list = dir(strcat(file_path,'*.jpg'));%獲取該文件夾中所有jpg格式的圖像
photo_num = length(img_path_list);%獲取該文件夾中所有jpg格式的圖像的數(shù)量
disp('The number of pictures ');
fprintf('%d \n',photo_num);% 顯示圖像數(shù)量
if photo_num > 0 %.jpg的圖像存在
for j = 1:photo_num image_name = img_path_list(j).name;% 圖像名
image = imread(strcat(file_path,image_name));
Image = rgb2gray(image);%調(diào)用matlab原有函數(shù)將圖片轉(zhuǎn)化為灰度圖
imshow(Image);
imwrite(Image,strcat('D:\matlab_java_test\new',image_name,'.jpg'));%保存圖片
pause(2);%暫停兩秒,用來顯示圖像
end
close all; %由于出來好多個figure,一鍵關(guān)閉
status = 'SUCCESS';
end
end```
***
3.在Matlab下選擇應(yīng)用程序萍虽,使用Library Compiler工具得到Matlab函數(shù)的.jar文件睛廊。打開Library Compiler工具后,選擇Java Package,再點擊+號杉编,選擇要打包的.m文件超全,填寫修改相關(guān)的信息,紅框4顯示的是打包成.jar文件后里面包含的類以及方法的名稱邓馒,信息可以根據(jù)自己需要更改嘶朱,最后單擊Package。生成的文件我存放在D盤下光酣,可以看到有四個主要的部分疏遏,for_redistribution文件,for_redistribution_files_only文件救军,for_testing文件以及PackagingLog.txt财异。
![Paste_Image.png](http://upload-images.jianshu.io/upload_images/2761157-5920fa85ba601706.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
![Paste_Image.png](http://upload-images.jianshu.io/upload_images/2761157-35e6a8627d61962e.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
![Paste_Image.png](http://upload-images.jianshu.io/upload_images/2761157-32f3533ddc62d9cf.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
-for_redistribution包含用于安裝應(yīng)用程序和MATLAB Runtime的文件,可以將這份文件復(fù)制到?jīng)]有安裝Matlab的電腦上唱遭,安裝該文件戳寸,在安裝過程中會提示要安裝獨立的共享庫MATLAB Runtime,安裝之后不需要Matlab也可以運行編譯后的Matlab的程序或者元件(The MATLAB Runtime is a standalone set of shared libraries that enables the execution of compiled MATLAB applications or components on computers that do not have MATLAB installed)胆萧。
-for_redistribution_files_only文件夾包含應(yīng)用程序的重新發(fā)布所需的文件庆揩。這些文件可以分發(fā)到那些有MATLAB或者有 MATLAB Runtime 的用戶的電腦上。
-for_testing文件夾包含創(chuàng)建的所有由MCC創(chuàng)建的文件跌穗,像二進制文件和jar订晌,頭和源文件,使用這些文件來測試安裝蚌吸。 -PackagingLog.txt是由編譯器生成的日志文件锈拨。 如果.jar庫中的內(nèi)容不熟悉也可以找到doc下的html文件夾,打開index.html,里面有Javadoc參考資料羹唠。
![Paste_Image.png](http://upload-images.jianshu.io/upload_images/2761157-d01df2cc7ed18445.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
![Paste_Image.png](http://upload-images.jianshu.io/upload_images/2761157-d687249cfd1a1106.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
***
4.打開Eclipse奕枢,新建一個Java Project娄昆,命名為TestMatlab,新建一個類命名為Test,然后把生成的.jar文件(如rgbtogray.jar)復(fù)制到該工程下,除此之外缝彬,還要將另外一個.jar文件復(fù)制到該工程下萌焰,該文件是javabuilder.jar,在<mcr_root>*\toolbox\javabuilder\jar\win64\javabuilder.jar目錄下可以找到谷浅,<mcr_root>*是MATLAB的安裝目錄或者MATLAB Runtime的安裝目錄扒俯,這兩個目錄下均可以找到toolbox\javabuilder\jar\win64\javabuilder.jar。將.jar文件復(fù)制到TestMatlab工程下之后一疯,選中該工程撼玄,單擊file,選擇Properties,選擇Java Build Path墩邀,選擇Libraries,選擇ADD JARs掌猛,再將需要的.jar添加進去。
![](http://upload-images.jianshu.io/upload_images/2761157-0fd31b1db0131de8.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
***
5.編寫Java測試代碼,代碼如下:
import com.mathworks.toolbox.javabuilder.MWException;
import rgbtogray.RgbtoGray;
//status :函數(shù)返回值存放于status
//status = matlab.rgbtogray(1,"D:\matlab_java_test\")
//1代表原來函數(shù)需要的參數(shù)個數(shù)為1
//"D:\matlab_java_test\"代表原來函數(shù)中的file_path參數(shù)
public class Test {
public static void main(String[] args) { // TODO Auto-generated method stub
try { RgbtoGray matlab = new RgbtoGray();
Object[] status ;
status = matlab.rgbtogray(1,"D:\matlab_java_test\");
for(Object i:status)
System.out.println(i);
} catch (MWException e) { // TODO Auto-generated catch block
e.printStackTrace();
}//這里RgbtoGray matlab = new RgbtoGray()時需要拋出異常
RgbtoGray.disposeAllInstances();
}
}```
5.運行結(jié)果:可以看到函數(shù)成功地調(diào)用了Matlab函數(shù)眉睹,將圖像灰度化荔茬,并且函數(shù)執(zhí)行完之后成功返回了SUCCESS.