一、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?
importcom.mathworks.toolbox.javabuilder.MWException;
importcom.mathworks.toolbox.javabuilder.MWNumericArray;
importXXX.XXXX;
classTest {
publicstaticvoidmain(String[] args) {
try{
XXXX abc=newXXXX();
Object[] result =null;/* Stores the result */
inta=10, b=2;
result=abc.operation(4, a, b );
System.out.println(result[0].toString());
System.out.println(result[1].toString());
System.out.println(result[2].toString());
System.out.println();
}catch(MWException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}finally{
/* Free native resources */
System.gc();
}
}
如果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.(MWMCR.java:1449)
at operation.OperationMCRFactory.(OperationMCRFactory.java:99)
at operation.Operation.(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.(MWMCR.java:1449)
at operation.OperationMCRFactory.(OperationMCRFactory.java:99)
at operation.Operation.(Operation.java:61)
at JavaTestMatlab.main(JavaTestMatlab.java:18)
用eclipse做開發時,其中一個jar包需要使用jni去引用dll文件,出現這個錯誤
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