2012-03-01 83 views
15

我想讓Matlab程序調用一個java文件,最好用一個例子。從MATLAB調用Java?

+10

請閱讀文檔。 [使用MATLAB的Java庫](http://www.mathworks.ch/help/techdoc/matlab_external/f44062.html) – zellus 2012-03-01 17:03:20

回答

23

好吧,我會盡量在這裏舉一個小例子。按照zellus的建議,從Matlab窗口中直接使用java函數,或者,如果需要,可以創建自己的java類。這裏有一個例子:

package testMatlabInterface; 

public class TestFunction 
{ 
    private double value; 

    public TestFunction() 
    { 
     value = 0; 
    } 

    public double Add(double v) 
    { 
     value += v; 
     return value; 
    } 
} 

然後把它變成一個jar文件。假設你把文件名爲testMatlabInterface文件夾中,在命令行中運行以下命令:

jar cvf testMatlab.jar testMatlabInterface 

然後,在Matlab中,瀏覽到您的testMatlab.jar文件所在的目錄,然後運行命令,import testMatlabInterface.*導入所有testMatlabInterface包中的課程。然後,你可以使用類,像這樣:

>> methodsview testMatlabInterface.TestFunction 
>> me = testMatlabInterface.TestFunction() 

me = 

[email protected] 

>> me.Add(10) 

ans = 

    10 

>> me.Add(10) 

ans = 

    20 

>> me.Add(10) 

ans = 

    30 

讓我知道如果我能的進一步幫助。

+0

非常感謝!你的帖子非常有幫助。 – 2012-03-02 10:48:09

28

有三種情況需要考慮。

  1. Java內置庫。

    也就是說,任何描述的內容都是here。這些項目可以直接調用。例如:

    map = java.util.HashMap; 
    map.put(1,10); 
    map.put(2,30); 
    map.get(1) %returns 10 
    

    唯一的複雜情況是Matlab在Matlab數據類型和Java數據類型之間執行的映射。這些映射描述爲here (Matlab to Java)here (Java to Matlab)。 (TL;博士:一般的映射關係,你所期望的)

  2. 預編譯的* .jar文件

    首先,您需要把這些東西加到Matlab的Java類路徑。您可以動態地做到這一點(即每Matlab的會話,無需任何Matlab的狀態),如下所示:

    javaaddpath('c:\full\path\to\compiledjarfile.jar') 
    

    您還可以通過編輯classpath.txt文件靜態添加這些。欲瞭解更多信息,請使用docsearch java class path

  3. 預編譯* .class文件。

    這些與* .jar文件相似,除了需要添加包含類文件的目錄,而不是類文件本身。例如:

    javaaddpath('c:\full\path\to\directory\containing\class\files\') 
    %NOT THIS: javaaddpath('c:\full\path\to\directory\containing\class\files\classname.class') 
    
+0

非常感謝。你的指導真的有幫助! – 2012-03-02 10:49:43

+0

類沒有發現異常,儘管我已經添加了路徑 – zinking 2013-07-13 11:39:11

+1

@zinking確保在編譯Java類時,您的目標是至少與您使用的MATLAB發行版一起提供的JRE版本。如果您的類文件比MATLAB的JRE支持的版本號更新,那麼它們將不會被加載,並且當您嘗試使用它們時會得到ClassNotFoundException。例如,R2006b附帶JRE5,因此您需要使用'javac --source 1.5 --target 1。5 <其他參數>'如果您使用JDK6或更新版本進行編譯。 – rob 2014-01-28 18:41:39