設計思路:首先在eclipse中使用java調用Matlab函數,再在Oracle存儲過程中將java類映射其中。(本文最終還是選擇了matlab2012b ,eclipse3.5,jdk1.6. 45,oracle12c(向下兼容jdk1.6,低版本不行))提供下載地址:http://pan.baidu.com/s/1dEj86op
(1)首先講解如何利用eclipse調用matlab函數,以及個人遇到的一些問題和問題的解決思路。
准備工作:安裝jdk,jdk的位數要與matlab的jdk的位數(32bit 和64bit 有區別的)相同,否則會出現兼容問題。jdk是高版本兼容低版本的。
假設你已經安裝了jdk 和 eclipse 和 matlab了。
首先,要確定你電腦上裝好了MATLAB並且配置好了Java的運行環境,注意,MATLAB的版本必須是2006b+(包括2006b或更高版本),因為只有在這些版本中才有MATLAB Builder for Java(也叫Java Builder)。
本人使用的 matlab2012b 版本 eclipse為 :win32.x86_64_1.1.200.v20150204-1316.
第一步:打開打開MATLAB(筆者用的是MATLAB 2012b,版本的一些差異我會在後面注明),在Command Window框中輸入deploytool,會跳出如下界面:
在Name中輸入名字,在Location中選擇路徑,最後在Type中選擇Java Package:
可能在有些版本中選擇Type時顯示的是Matlab Builder for Java,並且在Deployment Tool面板中還有Generate Verbose Output選項框,勾選上它,針對不同的版本時可能有一些出入,大家多留心一些,自己多嘗試嘗試。
舉一個加法函數的例子:在matlab中寫一個函數:
function sum = add(x,y)
sum=x+y;
end
保存成 add.m
然後在MATLAB中找到Java Package窗口,添加class文件,命名這個class文件的時候要注意了,因為這個文件就是以後導入到Java中要作為一個對象的名字,也就是說它就是放在new後面作為構造函數的類名。這裡命名為matlabAdd:
然後添加類和方法:
注意,此處仍然是matlabAdd.prj 下 add files 文件,此處截圖有誤,讀者了解即可。
進行打包,打成jar包:
調用打包好的matlab函數
在MATLAB安裝的目錄中找到”…\toolbox\javabuilder\jar\javabuilder.jar”的文件,並在你剛才打包的文件夾中找到對應的包,本例中是matlabAdd.jar,然後將這兩個jar包導入到你的Java項目當中。
其實真正使用64位時候,要在 win64中拷取javabuilder.jar文件,如圖:
其實,實在matlabAdd 項目的 src中拷取的 jar包:如圖:
找到這些jar包以後,在eclipse裡新建一個java項目,記住,jdk版本要匹配,比如mattlab中的jdk為64bit的那麼eclipse使用的也必須為64bit的,否則會出現加絨問題。
將jar包導入到項目以後,就可以進行編碼,對matlab的加法函數jar包進行調用了:
代碼如下:
package matLab;
import com.mathworks.toolbox.javabuilder.*;
import matlabAdd.*;
class matAdd
{
public static void main(String[] args)
{
MWNumericArray a = null;
MWNumericArray b = null;
Object[] result = null;
matlabAdd myAdd = null;
try
{
if (args.length != 2) { System.out.println("Error: must input 2 numbers!"); return; } a = new MWNumericArray(Double.valueOf(args[0]),MWClassID.DOUBLE); b = new MWNumericArray(Double.valueOf(args[1]),MWClassID.DOUBLE); myAdd = new matlabAdd(); result = myAdd.add(1, a, b); System.out.print("\nThe sum of " + a.toString() + " and " + b.toString() + " is: "); System.out.println(result[0]); } catch (Exception e) { System.out.println("Exception: " + e.toString()); } finally { MWArray.disposeArray(a); MWArray.disposeArray(b); MWArray.disposeArray(result); if (myAdd != null) myAdd.dispose(); } }
}
當輸入 1 3 時候,中間用空格隔開,結果:
運行結果為:
The sum of 1 and 3 is: 4
本次配置主要出現的額問題就是 jdk兼容問題,其他問題沒出現。
Exception in thread “main” java.lang.UnsatisfiedLinkError: Failed to find the library mclmcrrt7_17.dll, 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.17.
at com.mathworks.toolbox.javabuilder.internal.MCRConfiguration
at com.mathworks.toolbox.javabuilder.internal.MCRConfiguration.getProxyLibraryDir(MCRConfiguration.java:178)
at com.mathworks.toolbox.javabuilder.internal.MCRConfiguration
at com.mathworks.toolbox.javabuilder.internal.MCRConfiguration.getMCRRoot(MCRConfiguration.java:92)
at com.mathworks.toolbox.javabuilder.internal.MCRConfiguration$ModuleDir.(MCRConfiguration.java:66)
at com.mathworks.toolbox.javabuilder.internal.MCRConfiguration.getModuleDir(MCRConfiguration.java:71)
at com.mathworks.toolbox.javabuilder.internal.MWMCR.(MWMCR.java:1462)
at mysum.MysumMCRFactory.newInstance(MysumMCRFactory.java:48)
at mysum.MysumMCRFactory.newInstance(MysumMCRFactory.java:59)
at mysum.mysum.(mysum.java:62)
at sumceshi.main(sumceshi.java:9)
是因為你的matlab所運行的java虛擬機和你程序的java虛擬機,一個是64位,一個是32位,或者版本不同導致的。matlab輸入version -java看一下java版本,然後如果是64位的就去下一個安裝。我是用eclipse給你提供個eclipse 的修改方法,去你eclipse點window=>preferences=>installed JREs=>add,將新安裝的加進去,然後去你的項目右鍵=>properties=>java build path=>libraries把之前的jre刪了,然後點add librariy=>JRE system library=>alternate JRE,選你剛裝的jre,finishing,ok,