2011-08-08 81 views
6

我一直在使用Swig爲用C++編寫的庫創建一個Java包裝器。包裝生成一個包,然後jar'編輯。這些文件編譯正確,並且與java完美協作,但我無法從MATLAB調用它。從MATLAB調用Java

我試圖在MATLAB中的靜態Java路徑文件中添加jar的路徑,然後調用jar文件中的類,但我得到錯誤"Undefined variable or class.."或者如果我嘗試使用javaObject(...)"No class * can be located on Java class path"

我不知道我在做什麼錯。


編輯:

爲了測試調用從MATLAB一個C++庫,我創建了一個簡單的「數據讀取器」類,其中包含一個寫入隨機生成vector< vector<double> >到文本文件和一個功能和一個函數,它讀它。

產生的大口文件是:SimpleReader.javaDoubleVector.javaexampleJNI.javaexample.javaDoubleVector2.java在包com.example.reader。這些被編譯並打包到example.jar(生成的庫dll也被打包到jar中)。

這一切都工作正常,從Java調用它,所以這個問題必須具體到MATLAB。 MATLAB沒有太多的代碼,因爲沒有任何東西可以工作。我得到儘可能

javaclasspath('c:/reader/reader.jar'); 
obj = com.example.reader.SimpleReader; 

在這一點,我得到'Undefined variable "com" or class "com.example.reader.SimpleReader"'

+0

請給您正在執行什麼MATLAB的語句更詳細的例子。 –

回答

7

一般來說你應該能夠做到這一點:

javaclasspath('/path/to/myjar.jar') 
myobj = com.example.mypackage.MyObject; 
myobj.someMethod(123); 

我一直在使用這種與MATLAB已經有一段時間了,並沒有任何麻煩。也許你可以發佈你正在使用的確切的MATLAB代碼?


我得到儘可能

javaclasspath('c:/reader/reader.jar'); 
obj = com.example.reader.SimpleReader; 

在這一點得到 '未定義的變量 「COM」 或類 「com.example.reader.SimpleReader」'

那麼,對於初學者,你提到你的jar文件被稱爲example.jar,但你的MATLAB代碼引用reader.jar - 你確定你在javaclasspath() exis中引用的jar TS?你有沒有試過看它的內容? (例如,用7zip的或可讀取的.zip格式的文件,因爲.jar文件只是與其他規格的.zip格式文件的任何程序)


嗯...

  • 哪個版本你正在使用MATLAB嗎?
  • 是你的課程公開嗎?
  • 你明白了什麼,當你嘗試鍵入以下內容:

    javap -classpath c:/reader/example.jar com.example.reader.SimpleReader 
    

你說你正在使用的版本7.0.4 - 這是有可能的問題。 Earlier versions of MATLAB use an older version of the Java JRE

MATLAB僅在我們隨MATLAB提供的JVM上得到完全支持。例如:

JVM 1.3.1 MATLAB 6.5.1(R13SP1)

JVM 1.4.2 MATLAB 7.0.1(R14SP1)

MATLAB 7.0.4(R14SP2)及更高版本,直到MATLAB 7.4(R2007a)使用JVM 1.5和MATLAB 7.5(R2007b),後來使用JVM 1.6。有些組件在不同版本的JVM下可能無法正常工作。

你現在基本上有三種選擇。

  • (如果可能的話) - 使用與Java 5的兼容。在這種情況下,你讓你自己的圖書館只有JAR文件,你需要使用the -target 1.5 option。 (target="1.5"如果你使用的是螞蟻<javac>任務)這通常不是什麼大問題,因爲1.6是1.5的一個漸進式改進 - 雖然如果你使用的是一些少數的Java 6類,比如ArrayDeque,或者依靠1.6的外部庫,你運氣不好。

  • 使用JRE 1.6與Matlab 7.4通過changing the JVM。不知道這是一個好主意。

  • 將MATLAB升級到在Java 6(R2007b或更高版本)上運行的版本。

記住這個問題,當你去你的Java開發環境升級到Java 7和Java 8

+0

^我在這個問題中增加了更多細節,謝謝 – ssaammuu

+0

道歉我的意思是javaclasspath('c:/reader/example.jar'); 我也確保一切都在那裏使用jar -tf,然後以防萬一用7zip打開jar文件。 – ssaammuu

+0

我正在使用Matlab 7.0.4。這些類是公開的,並且具有沒有參數的公共構造函數。在該命令的結果:從 編譯「SimpleReader.java」 公共類com.example.reader.SimpleReader擴展java.lang.Object {// 方法 //這看起來是正確的 名單} – ssaammuu