java中調用Matlab的函數+注意事項


一、matlab版本必須支持java

在command 模式下面運行deploytool,如果支持該命令即可使用

 

二、matlab中function的書寫

 

%定義一個函數operation(a,b),求a與b的加減乘除運算,並返回結果

%函數定義function 輸出變量列表[s,m,...] 函數名(輸入變量列表)sum,sub,mul,div中

function [sum,sub,mul,div] = operation(a,b);

sum = a + b;

sub = a - b;

mul = a * b;

div = a / b;

end

 

PS:上面標紅的部分與java中調用該operation的返回值有關系,在java中調用的 Object result[] = XXX.operation(4,a,b); 4表示有4個返回值,分別存放在result[0]到result[4]中。

 

三、使用matlab編譯生成jar

在matlab命令窗口下輸入 deploytool,就會彈出一個編譯窗口,

然后點擊,file,選擇new-deployment project,

然后選擇matlab builder jave。

name的地方填寫工程名,

ocation填寫該工程的存儲位置。

點擊ok。

然后,把m文件添加到工程中,先new一個class,這個class的名字就是你將來在java中需要new的class的名字,也就是matlab中operation所在的class名字然后將你的m文件添加到這個class目錄下,然后直接build即可。

 

四、在java中使用matlab的函數

現在eclipse下面new一個新的java工程,然后將第三部build成功后產生的文件夾下面的distrib目錄中的XXX.jar 以及你matlab安裝目錄下/toolbox/javabuilder/jar/javabuilder.jar加入你的java工程extend lib 中去。

 

然后你可以清晰的看到XXX.jar中包含的函數和類

 

[java] view plaincopyprint?
  1. import com.mathworks.toolbox.javabuilder.MWException;
  2. import com.mathworks.toolbox.javabuilder.MWNumericArray;
  3. import XXX.XXXX;
  4. class Test {
  5. publicstaticvoid main(String[] args) {
  6. try {
  7. XXXX abc=new XXXX();
  8. Object[] result = null; /* Stores the result */
  9. int a=10, b=2;
  10. result=abc.operation(4, a, b );
  11. System.out.println(result[0].toString());
  12. System.out.println(result[1].toString());
  13. System.out.println(result[2].toString());
  14. System.out.println();
  15. } catch (MWException e1) {
  16. // TODO Auto-generated catch block
  17. e1.printStackTrace();
  18. } finally {
  19. /* Free native resources */
  20. System.gc();
  21. }
  22. }

如果result[0]返回的是一個數組,可以通過如下的方法解決

 

MWNumericArray a = new MWNumericArray(Double.valueOf(result[0].toString()),MWClassID.DOUBLE);

MWNumericArray temp = (MWNumericArray)result[0];

float [][] weights=(float[][])temp.toFloatArray();

 

 

五、可能碰到的問題

Exception in thread "main" java.lang.UnsatisfiedLinkError: Failed to find the library libmwmclmcrrt.so.7.13, required by MATLAB Builder JA, on java.library.path. This library is typically installed along with MATLAB or the MCR, its absence may indicate an issue with that installation or the current path configuration. The MCR version that this component is trying to use is: 7.13.

 

 

Failed to find the library mclmcrrt710.dll,required by MATLAB Builder JA, on java.library.path

 

 

原因是2009a要對應安裝mclmcrrt7.10。在MATLAB安裝目錄下查找:\toolbox\compiler\deploy\win32,找到MCRInstaller.exe 安裝,重啟Eclipse即可。

 

也有可能遇到:

Exception in thread "main" java.lang.UnsatisfiedLinkError: Can't load library: d:\Program Files\MATLAB\R2009a\bin\win32\nativemcl.dll
 at java.lang.ClassLoader.loadLibrary(Unknown Source)
 at java.lang.Runtime.load0(Unknown Source)
 at java.lang.System.load(Unknown Source)
 at com.mathworks.toolbox.javabuilder.internal.MWMCR.<clinit>(MWMCR.java:1449)
 at operation.OperationMCRFactory.<clinit>(OperationMCRFactory.java:99)
 at operation.Operation.<init>(Operation.java:61)
 at JavaTestMatlab.main(JavaTestMatlab.java:18)

是說找不到nativemcl.dll文件。我的系統是64位系統,所以在bin目錄下是win64文件夾。為了適應,我在bin目錄下新建了一個win32文件夾,把nativemcl.dll復制到里面去。

后來報錯為:

 Exception in thread "main" java.lang.UnsatisfiedLinkError: D:\Program Files\MATLAB\R2009a\bin\win32\nativemcl.dll: Can't load AMD 64-bit .dll on a IA 32-bit platform
 at java.lang.ClassLoader$NativeLibrary.load(Native Method)
 at java.lang.ClassLoader.loadLibrary0(Unknown Source)
 at java.lang.ClassLoader.loadLibrary(Unknown Source)
 at java.lang.Runtime.load0(Unknown Source)
 at java.lang.System.load(Unknown Source)
 at com.mathworks.toolbox.javabuilder.internal.MWMCR.<clinit>(MWMCR.java:1449)
 at operation.OperationMCRFactory.<clinit>(OperationMCRFactory.java:99)
 at operation.Operation.<init>(Operation.java:61)
 at JavaTestMatlab.main(JavaTestMatlab.java:18)

用eclipse做開發時,其中一個jar包需要使用jni去引用dll文件,出現這個錯誤

  1. Can't load AMD 64-bit .dll on a IA 32-bit platform
我的系統是win7 64位的,我發現eclipse使用的jre是32位的
 
解決辦法使用jre_x64運行,把dll文件放到工程下面:
下載地址
http://www.oracle.com/technetwork/java/javase/downloads/jre-6u26-download-400751.html
 
配置:

 
創建工程時選擇jre_x64
運行時:

end


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM