| 東南大學(xué)機(jī)械工程系 陳永洲 | ||
|
在INTERNET/INTRANET網(wǎng)絡(luò)通信技術(shù)的迅猛發(fā)展的今天,分布式異構(gòu)集成應(yīng)用系統(tǒng)的開發(fā)和使用是必然發(fā)展方向;JAVA具有穩(wěn)定、可靠、跨平臺(tái)等優(yōu)點(diǎn),利用其開發(fā)分布式計(jì)算系統(tǒng),是必然的趨勢(shì)。同時(shí),
MATLAB是Mathworks公司推出的針對(duì)數(shù)值計(jì)算的交互式軟件,具有強(qiáng)大的數(shù)值分析、矩陣運(yùn)算、信號(hào)處理和圖形顯示功能;MATLAB以其強(qiáng)大的數(shù)據(jù)處理能力和豐富的工具箱使得他的編程極為簡(jiǎn)單,可大幅縮短應(yīng)用程序開發(fā)周期,提高編程效率。因而JAVA通過VC++實(shí)現(xiàn)MATLAB的圖形處理和顯示是提高效率的一種可行策略。最終實(shí)現(xiàn)JAVA、MATLAB通信必須解決兩方面的問題:一是JAVA與VC++的通信;二是VC++與MATLAB的通信。
本系統(tǒng)(是分布式網(wǎng)絡(luò)多代理系統(tǒng)中的一代理服務(wù)器——人工神經(jīng)網(wǎng)絡(luò)代理服務(wù)器)的功能實(shí)現(xiàn)是:從JBUILDER開發(fā)環(huán)境的JAVA程序通過調(diào)用包含MATLAB圖形處理和顯示功能DLL,實(shí)現(xiàn)圖像顯示。其中VC需要MATLAB的“title.m、xlabel.m、ylabel.m”三個(gè)文件和為實(shí)現(xiàn)圖形處理顯示編寫的文件“errorpicture.m”。系統(tǒng)的開發(fā)環(huán)境是:WindowXP操作系統(tǒng)、VisualC++6.0和JBUILDER6.0開發(fā)工具、MATLAB6.5軟件。
1 實(shí)現(xiàn)JAVA與VC通信方法簡(jiǎn)介
JAVA與VC的交互可以通過各自單獨(dú)運(yùn)行的程序讀寫約定的格式的文件來交流,但是通信的實(shí)時(shí)性不能保證;可以利用CORBA機(jī)制,通過定義IDL接口的客戶機(jī)/服務(wù)器(CLIENT/SERVER)的形式通訊,這加大了系統(tǒng)簡(jiǎn)單功能實(shí)現(xiàn)的復(fù)雜化;還可以通過JNI(Java Native Interface)或RMI(Remote Method Invo ca tion)等方法實(shí)現(xiàn)。
在 微軟 的操作系統(tǒng)上,實(shí)現(xiàn)本機(jī)程序之間的通信應(yīng)用JNI機(jī)制較方便快捷、穩(wěn)定可靠,并能實(shí)現(xiàn)實(shí)時(shí)通信。本示例系統(tǒng)的實(shí)現(xiàn)就使用了此機(jī)制。
1.1 實(shí)現(xiàn)JAVA與VC++(DLL)互連
首先在JBUILDER中建立一工程,如:MASS,使用MASSFrame為框架(Frame)的類名。
系統(tǒng)為了使用VC中實(shí)現(xiàn)的MATLAB圖形處理的DLL,需在JAVA文件的class MASSFrame中,添加如下一些代碼:
public native void showPicture();
//實(shí)現(xiàn)調(diào)用的DLL中函數(shù)申明
static
{
System.loadLibrary ("showpicture");
//使用DLL文件,其名稱是“showpicture.dll”
}
void jBShowPicture_actionPerformed(ActionEvent e)
{
showPicture();
//JAVA程序?qū)LL中函數(shù)的使用
}
1.2 系統(tǒng)運(yùn)行設(shè)置與編譯
須對(duì)使用DLL中MATLAB函數(shù)的JAVA文件編譯屬性進(jìn)行設(shè)置,在JBUILDER工具中的Project視圖區(qū)域找到class MASSFrame.java(各開發(fā)者確定的文件名可能不同)的文件,選中后按下鼠標(biāo)右鍵,在出現(xiàn)的菜單中選擇“Properties”項(xiàng),接著按照“Build->RMI/JNI->Generate JNI header file”找到“Generate JNI header file”項(xiàng)目,選定。編譯該文件,可得相應(yīng)的h文件。本系統(tǒng)產(chǎn)生“mass_ MASSFrame.h”,其中調(diào)用的函數(shù)為:“JNIEXPORT void JNICALL Java_mass_MASSFrame_showPicture (JNIEnv *, jobject); ”。
如果僅使用 SUN 公司的JDK來實(shí)現(xiàn),須用javah.exe將javac.exe編譯生成的class文件去生成對(duì)應(yīng)的h文件,接著修改h文件,即將文件所在的包層次,在被調(diào)用的函數(shù)名上體現(xiàn)出來,也就是“JNIEXPORT void JNICALL Java_MASSFrame_showPicture (JNIEnv *, jobject); ”修改為上面的調(diào)用函數(shù)名。
1.3 JAVA應(yīng)用系統(tǒng)運(yùn)行
將VC生成的DLL文件拷到JBUILDER當(dāng)前運(yùn)行程序的目錄下,執(zhí)行程序,就實(shí)現(xiàn)JAVA系統(tǒng)和MATLAB的通信。本示例系統(tǒng)的DLL是“showpicture.dll” (即下面的“實(shí)現(xiàn)VC、MATLAB通信方法簡(jiǎn)介”所產(chǎn)生的)。其運(yùn)行結(jié)果顯示圖如圖1:
圖1 JAVA調(diào)用DLL的圖像顯示
2 實(shí)現(xiàn)VC、MATLAB通信方法簡(jiǎn)介
MATLAB提供了許多方法與VC程序的通信:MATLAB引擎(ENGINE)模式,采用了客戶機(jī)/服務(wù)器(CLIENT/SERVER)的計(jì)算形式,通過MATLAB應(yīng)用程序接口(API)中有關(guān)函數(shù),在VC環(huán)境中調(diào)用MATLAB函數(shù),但此種方法需要MATLAB環(huán)境后臺(tái)支持,因此系統(tǒng)必須安裝MATLAB;MATLAB本身提供的MCC工具編譯,編譯m文件生成VC++或c語言,直接在VC中使用;MATLAB的MEX工具將m文件編譯成DLL,供VC調(diào)用。。。。。。
MATLAB現(xiàn)具有的MATLAB Add—in(其包裝了MCC、MEX)更方便了第二、三種方法的應(yīng)用,現(xiàn)本系統(tǒng)的實(shí)現(xiàn)就是以第三種為基礎(chǔ)的。
2.1 MATLAB與VC實(shí)現(xiàn)互連
為了在開發(fā)時(shí)實(shí)現(xiàn)對(duì)MATLAB的具體功能的調(diào)用,應(yīng)首先在操作系統(tǒng)中安裝MATLAB工具軟件,之后并運(yùn)行此工具軟件,依次執(zhí)行“mex –setup;mbuild –setup;cd (p refdir); mccsavepath;”命令。之后運(yùn)行VC開發(fā)工具,從VC++菜單中依次打開“Tools->Customize->Add-ins and Macro Files”,選中MATLAB Add—in宏,可以看到工具欄中多了一個(gè) 。現(xiàn)在VC就可以利用它來得到m文件所對(duì)應(yīng)的c、c++文件。
2.2 開發(fā)工具VC運(yùn)行環(huán)境設(shè)置
開發(fā)時(shí),須對(duì)VC的開發(fā)環(huán)境變量進(jìn)行設(shè)置。通過“Tools->Options->Directories”找到的“Directories”項(xiàng)中添加環(huán)境變量。
添加頭文件和庫文件搜索路徑有(本計(jì)算機(jī)的文件搜索路徑為):
F:/MATLAB6P5/EXTERN/INCLUDE
F:/MATLAB6P5/EXTERN/INCLUDE/CPP
同時(shí)將MATLAB的鏈接庫添加到VC中。從“Tools->Options->Directories”中“Show directories for:”下拉框里選擇“Library files”,然后再在“Directories”項(xiàng)中添加環(huán)境變量。
F:/MATLAB6P5/EXTERN/LIB
F:/MATLAB6P5/EXTERN/LIB/WIN32
F:/MATLAB6P5/EXTERN/LIB/WIN32/MICROSOFT/MSVC60
上述為VC編譯MATLAB的m文件生成C代碼的環(huán)境。同時(shí)為了編譯JNI的h文件,還須通過菜單Tools.和Project添加如下頭文件和庫文件搜索路徑:
D:/JBUILDER6/JDK1.3.1/INCLUDE
D:/JBUILDER6/JDK1.3.1/INCLUDE/WIN32
2.4 VC生成DLL
本系統(tǒng)首先用VC建立“MATLAB Project Wizard”項(xiàng)中名稱為showpicture的Project,其中Project的選項(xiàng)結(jié)果如下圖2所示:
圖2 創(chuàng)建工程選項(xiàng)結(jié)果
將1.2中生成的mass_ MASSFrame.h文件拷貝到系統(tǒng)目錄下,并添加到VC的“FileView”中“HeadFiles”里面。
在VC中為了對(duì)JAVA程序提供可調(diào)用的函數(shù),須在“showpicture.c”文件中添加:
#include " mass_ MASSFrame.h"
//dll導(dǎo)出的JAVA調(diào)用函數(shù)的具體實(shí)現(xiàn)部分
JNIEXPORT void JNICALL
Java_mass_MASSFrame_showPicture
(JNIEnv *en, jobject ob)
{
showpictureInitialize();//初始化
mlfErrorpicture();//圖像顯示
mlfHGWaitForFiguresToDie();//關(guān)閉顯示相關(guān)資源
}
“F7”編譯程序,于是便得到“showpicture.dll”。
2.3 脫離MATLAB環(huán)境運(yùn)行的支持文件
為了在沒有安裝MATLAB應(yīng)用軟件的環(huán)境下,能夠使用其功能的DLL,須在運(yùn)行此DLL的目錄中添加一些文件,而這些文件可以通過工具欄中的“MATLAB Add-in Packager”獲得。按照此工具默認(rèn)的配置運(yùn)行,得到一個(gè)zip壓縮文件,使用時(shí),將其解壓到DLL文件所在的目錄中,DLL就能脫離MATLAB環(huán)境使用。
3 結(jié)論
采用JAVA系統(tǒng)在對(duì)外服務(wù)時(shí),利用MATLAB完成軟件核心算法設(shè)計(jì)和圖形處理、顯示,很大程度上降低了編程難度和工作量, 縮短開發(fā)周期,并提高了軟件的可靠性。基于VC++6.0實(shí)現(xiàn)JAVA和MATLAB的通信——利用VC編譯器調(diào)用包含MATLAB處理功能的動(dòng)態(tài)連接庫實(shí)現(xiàn)脫離MATLAB環(huán)境下運(yùn)行實(shí)現(xiàn)JAVA和MATLAB二者的緊密結(jié)合,更極大拓展了MATLAB的應(yīng)用范圍,并同時(shí)也深化了JAVA和MATLAB的應(yīng)用能力。
附注:errorpicture.m文件的內(nèi)容如下:
function errorpicture()
s='NN/訓(xùn)練誤差結(jié)果顯示.txt';
fid=fopen(s,'r');
while (feof(fid))~=true
[x,n]=fscanf(fid,'%12f');
end;
if(n>1)
t=1:1*100:n*100;
plot(t,x);
ylabel('誤差絕對(duì)值');
xlabel('訓(xùn)練次數(shù)(次)');
title('人工神經(jīng)網(wǎng)絡(luò)訓(xùn)練誤差結(jié)果顯示圖');
grid;
end;
fclose(fid); |
更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主
微信掃碼或搜索:z360901061
微信掃一掃加我為好友
QQ號(hào)聯(lián)系: 360901061
您的支持是博主寫作最大的動(dòng)力,如果您喜歡我的文章,感覺我的文章對(duì)您有幫助,請(qǐng)用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長(zhǎng)非常感激您!手機(jī)微信長(zhǎng)按不能支付解決辦法:請(qǐng)將微信支付二維碼保存到相冊(cè),切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對(duì)您有幫助就好】元

