隨筆 - 303  文章 - 883  trackbacks - 0
          <2007年4月>
          25262728293031
          1234567
          891011121314
          15161718192021
          22232425262728
          293012345

          歡迎光臨! 
          閑聊 QQ:1074961813

          隨筆分類(357)

          我管理的群

          公共blog

          • n維空間
          • Email : java3d@126.com 群 : 12999758

          參與管理的論壇

          好友的blog

          我的其他blog

          朋友的網(wǎng)站

          搜索

          •  

          最新評(píng)論

          chb請(qǐng)注意:改文有一定的參考價(jià)值,實(shí)際編程實(shí)現(xiàn)就未必一定用這個(gè)方法(僅僅做參考用)


          [ 作者:佚名    轉(zhuǎn)貼自:中國學(xué)術(shù)交流園地]

          系統(tǒng)實(shí)現(xiàn):從JAVA程序傳遞噪聲標(biāo)準(zhǔn)差和兩個(gè)數(shù)據(jù)給MATLAB,即給其實(shí)現(xiàn)具體的數(shù)據(jù)計(jì)算功能的DLL(通過VC++生成DLL),產(chǎn)生高斯分布的白噪聲數(shù)據(jù)。其中VC需要MATLAB軟件自帶的"normrnd.m、rndcheck.m"兩個(gè)文件和產(chǎn)生白噪聲的文件"noise.m"。開發(fā)環(huán)境是:Window2000操作系統(tǒng)、VisualC++6.0和JBUILDER6.0開發(fā)工具、MATLAB6.5軟件。
            要實(shí)現(xiàn)JAVA、MATLAB通信必須解決兩方面的問題:一是JAVA與VC++的通信;二是VC++與MATLAB的通信。~..~
            1 實(shí)現(xiàn)JAVA與VC通信方法簡(jiǎn)介
            JAVA與VC的交互,可以通過各自單獨(dú)運(yùn)行的程序讀寫約定的格式的文件來完成,但是通信的實(shí)時(shí)性不能保證;可以利用CORBA機(jī)制,通過定義IDL接口的客戶機(jī)/服務(wù)器(CLIENT/SERVER)的形式通訊;還可以通過JNI(Java Native Interface)或RMI(Remote Method Invocation)等方法實(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)互連
            在JUBILDER6開發(fā)環(huán)境中,系統(tǒng)先生成NNSD的Project,其框架類名為Frame1。
            系統(tǒng)為了使用VC實(shí)現(xiàn)的DLL,在Frame1.java文件中調(diào)用VC中函數(shù)處添加如下一些代碼:
          public native void makeNoise(float m,int n);
          //實(shí)現(xiàn)調(diào)用的DLL中函數(shù)申明
          static
          {
              System.loadLibrary (
          "makenoise");
              
          //使用DLL文件,其名稱是"makenoise.dll"
          }

          void jButton1_actionPerformed(ActionEvent e)
          //框架通過按鈕消息實(shí)現(xiàn)DLL的調(diào)用
          {
              
          int n=160;//白噪聲數(shù)據(jù)量
              float m=1.0;//白噪聲方差平方
              makeNoise(m,n);
              
          //JAVA程序?qū)LL中函數(shù)的使用
          }
           

            1.2 系統(tǒng)運(yùn)行設(shè)置與編譯
            使用JBUILDER開發(fā)時(shí),須對(duì)使用DLL中函數(shù)的JAVA文件編譯屬性進(jìn)行設(shè)置。本系統(tǒng)在JBUILDER工具中的Project視圖區(qū)域找到Frame1.java(各開發(fā)者確定的文件名可能不同)的文件,選中后按下鼠標(biāo)右鍵,在出現(xiàn)的菜單中選擇"Properties"項(xiàng),接著將"Build->RMI/JNI->Generate JNI header file"找到的項(xiàng)目選定。最后編譯該文件,可得相應(yīng)的h文件。本系統(tǒng)產(chǎn)生"nnsd_Frame1.h",其中調(diào)用的函數(shù)為:

          JNIEXPORT void JNICALL Java_nnsd_Frame1_makeNoise
          (JNIEnv 
          *, jobject, jfloat, jint); 

            如果僅使用SUN公司的JDK來實(shí)現(xiàn),須用javah.exe將javac.exe生成的class文件去生成對(duì)應(yīng)的h文件,之后并要修改h文件,即須將文件的包層次在調(diào)用的函數(shù)名上體現(xiàn)出來。
            1.3 JAVA應(yīng)用系統(tǒng)運(yùn)行
            將VC生成的DLL文件拷到JBUILDER運(yùn)行程序的目錄下,執(zhí)行程序,就實(shí)現(xiàn)了JAVA系統(tǒng)和MATLAB的通信。本示例系統(tǒng)的DLL是"makenoise.dll",即下面介紹的方法所產(chǎn)生的。
          如果僅使用SUN公司的JDK來實(shí)現(xiàn),須用javah.exe將javac.exe生成的class文件去生成對(duì)應(yīng)的h文件,之后并要修改h文件,即須將文件的包層次在調(diào)用的函數(shù)名上體現(xiàn)出來。
            1.3 JAVA應(yīng)用系統(tǒng)運(yùn)行
            將VC生成的DLL文件拷到JBUILDER運(yùn)行程序的目錄下,執(zhí)行程序,就實(shí)現(xiàn)了JAVA系統(tǒng)和MATLAB的通信。本示例系統(tǒng)的DLL是"makenoise.dll",即下面介紹的方法所產(chǎn)生的。
          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后臺(tái)支持,因此系統(tǒng)必須安裝MATLAB;MATLAB本身提供的MCC工具編譯,編譯m文件生成VC++或c語言,直接在VC中使用;MATLAB的MEX工具將m文件編譯成dll,供VC調(diào)用,但這增加的程序的復(fù)雜性,沒有第二種方法靈活。
            MATLAB現(xiàn)具有的MATLAB Add-in(其包裝了MCC)更方便了第二種方法的應(yīng)用,現(xiàn)本系統(tǒng)的實(shí)現(xiàn)就是以之為基礎(chǔ)的。
            2.1 MATLAB與VC實(shí)現(xiàn)互連
            為了使用MATLAB的具體功能,在開發(fā)環(huán)境中應(yīng)首先安裝MATLAB工具軟件,之后運(yùn)行此工具軟件,分別執(zhí)行"mex -setup;mbuild -setup;cd(prefdir); mccsavepath;"命令。現(xiàn)在再運(yùn)行VC開發(fā)工具,從菜單開始依次打開"Tools->Customize->Add-ins and Macro Files",選中MATLAB Add-in項(xiàng),就可以看到工具欄中多了一個(gè)   。現(xiàn)在VC就可以利用它來得到m文件所對(duì)應(yīng)的c、c++文件。
            2.2 開發(fā)工具VC運(yùn)行環(huán)境設(shè)置
            系統(tǒng)開發(fā)時(shí),須對(duì)VC的開發(fā)環(huán)境變量進(jìn)行設(shè)置。通過"Tools->Options->Directories"找到的Directories項(xiàng)中添加環(huán)境變量。
            添加頭文件和庫文件搜索路徑[3]是(本計(jì)算機(jī)的文件搜索路徑為):
          F:MATLAB6P5EXTERNINCLUDE F:MATLAB6P5EXTERNINCLUDECPP F:MATLAB6P5EXTERNLIB F:MATLAB6P5EXTERNLIBWIN32 F:MATLAB6P5EXTERNLIBWIN32MICROSOFTMSVC60
            上述為VC編譯MATLAB的m文件生成C++代碼的環(huán)境。同時(shí)為了編譯JNI的h文件,還須通過菜單Tools.和Project添加如下頭文件和庫文件搜索路徑:
          D:JBUILDER6JDK1.3.1INCLUDE D:JBUILDER6JDK1.3.1INCLUDEWIN32
            2.4 VC生成DLL[4]
            在本系統(tǒng)中,VC建立名稱為makenoise的"MFC APPWizard(dll)"Project,按照VC默認(rèn)的選項(xiàng)完成工程的創(chuàng)立。
            將1.2中生成的nnsd_Frame1.h文件拷貝到系統(tǒng)目錄下,并添加到VC的"FileView"中"HeadFiles"里面。通過MATLAB Add-in將"normrnd.m、rndcheck.m、noise.m"文件添加到VC中,并自動(dòng)生成VC文件。具體操作步驟如下:
            點(diǎn)擊工具欄中"Add m-files to current project"項(xiàng),在出現(xiàn)的圖中選定如下選項(xiàng):

          圖1 添加m文件的Add-in選擇
            按照接著步驟的提示將上述3個(gè)m文件添加到項(xiàng)目中。
            在VC中為了對(duì)外提供可調(diào)用的函數(shù),須在"makenoise.cpp"文件中添加:
          #include "nnsd_Frame1.h"
          JNIEXPORT void JNICALL Java_nnsd_Frame1_makeNoise
          (JNIEnv *env, jobject obj, jfloat m, jint n){}
          //將原申明的函數(shù)的變量名補(bǔ)上,具體實(shí)現(xiàn)功能代碼在下面。
            為了讓上述導(dǎo)出函數(shù)獲得對(duì)MATLAB中白噪聲函數(shù)的調(diào)用,須在此文件中再添加:
          #include "math.h"
          #include 
          "dblmtrx.h"
          //下面申明得到全局matlab的函數(shù)
          extern void InitializeModule_noise();//初始化
          extern void noise(mwArray n, mwArray m);//產(chǎn)生白噪聲函數(shù)
          extern void TerminateModule_noise();//關(guān)閉資源
          //dll導(dǎo)出JAVA函數(shù)的具體實(shí)現(xiàn)部分
          JNIEXPORT void JNICALL Java_nnsd_Frame1_makeNoise
          (JNIEnv 
          *env, jobject obj, jfloat m, jint n)
          {
              AfxMessageBox(
          "開始產(chǎn)生白噪聲!");
              InitializeModule_noise();
              noise(n,m);
              TerminateModule_noise();
          }


            編譯整個(gè)程序,于是便得到"makenoise.dll"。
            2.3 脫離MATLAB環(huán)境運(yùn)行的支持文件
            為了在沒有安裝MATLAB應(yīng)用軟件的環(huán)境下,能夠使用上述的DLL,須在運(yùn)行此DLL的目錄中添加一些文件,而這些文件可以通過工具欄中的"MATLAB Add-in Packager"獲得。按照此工具默認(rèn)的配置得到一個(gè)運(yùn)行所需文件的zip壓縮文件,使用時(shí),解壓縮到DLL文件所在的目錄中,就能脫離MATLAB環(huán)境使用DLL。
            3 結(jié)論
          采用JAVA完成圖形界面設(shè)計(jì)、數(shù)據(jù)管理等,利用MATLAB數(shù)學(xué)庫完成軟件核心算法設(shè)計(jì),很大程度上降低了編程難度和工作量, 縮短開發(fā)周期,提高軟件可靠性。尤其利用編譯器調(diào)用MATLAB動(dòng)態(tài)連接庫實(shí)現(xiàn)脫離MATLAB環(huán)境下二者的緊密結(jié)合,更極大拓展了MATLAB的應(yīng)用范圍。基于VC++6.0實(shí)現(xiàn)JAVA和MATLAB的通信,深化了JAVA和MATLAB的應(yīng)用能力。 
            附注:noise.m文件的內(nèi)容如下: 
          function makeNoise(n,m)
              c
          =normrnd(0,m,1,n);
              s
          =‘樣本文件.txt’‘;
              fid
          =fopen(s,‘W’);
              fprintf(fid,‘
          %6.2f’,c);
              fclose(fid); 



          地震讓大伙知道:居安思危,才是生存之道。

          FeedBack:
          # re: [轉(zhuǎn)]基于VC實(shí)現(xiàn)Java和Matlab的通信 2007-04-14 15:48 chb
          謝謝尋覓哥,小弟確實(shí)受益匪淺!但小弟天資愚鈍,還不是太懂!
          引入第三方語言進(jìn)行通訊確實(shí)可以,特別是脫離matlab環(huán)境是最好的。但不知道,這個(gè)要不要建立服務(wù)器。我們現(xiàn)在好像不具備建立服務(wù)器的條件!  回復(fù)  更多評(píng)論
            
          # re: [轉(zhuǎn)]基于VC實(shí)現(xiàn)Java和Matlab的通信 2007-04-16 15:50 幻想~@@~
          不需要的,我寫個(gè)方案給你好了,注意后面的文章!
          謝謝你的支持!!!
          還有問題繼續(xù)聯(lián)系!不必客氣 呵呵
            回復(fù)  更多評(píng)論
            
          # re: [轉(zhuǎn)]基于VC實(shí)現(xiàn)Java和Matlab的通信 2007-04-16 18:08 lusm
          主站蜘蛛池模板: 英超| 米脂县| 徐州市| 宁蒗| 确山县| 遂溪县| 仁化县| 新沂市| 五指山市| 扎赉特旗| 永靖县| 栖霞市| 湘潭市| 成安县| 乌兰浩特市| 浦县| 丰原市| 合阳县| 清原| 长宁县| 棋牌| 陇西县| 五原县| 合阳县| 蓬莱市| 石楼县| 财经| 揭阳市| 家居| 湘阴县| 黄骅市| 洛隆县| 阳信县| 襄垣县| 邻水| 墨竹工卡县| 安平县| 安阳县| 蒙阴县| 通榆县| 武陟县|