2011-05-21 69 views
11

我想創建一個使用PHP/Java Bridge的Matlab函數的web應用程序。讓我來解釋:Matlab,PHP&Java

  1. 我需要寫功能的MATLAB
  2. 使用MATLAB JA建設者
  3. 使用PHP/Java橋調用PHP和顯示這個函數的函數轉換成一個jar文件結果。

到目前爲止,我已經這樣做了。我創建了一個名爲「makesqr.m」一個非常簡單的Matlab的文件,該文件是如下:

function y=makesqr(x) 
    y = magic(x); 
end 

我打包成一個名爲「themagic.jar」利用Matlab建設者JA一個jar文件這一點。 安裝Tomcat和PHP/Java橋和寫一個PHP函數調用makesqr FUNC這樣的:

<?php 
    require_once("http://localhost:8080/JavaBridgeTemplate621/java/Java.inc"); 
    $myclass=new Java("themagic.mksqr");//mksqr is the class which has the method named makesqr 
    $input = new Java("java.lang.Double", 5); 
    $noofoutputs=new Java("java.lang.Integer",1); 
    $matinp=new Java("com.mathworks.toolbox.javabuilder.MWNumericArray",$input); 
    $myclass->makesqr($noofoutputs,$matinp); 
?> 

我只是不斷收到此錯誤:

Uncaught [[o:Exception]:"java.lang.Exception: Invoke failed: [[o:mksqr]]->makesqr((o:int)[o:Integer], (o:Object;)[o:MWNumericArray]). Cause: java.lang.IllegalArgumentException: argument type mismatch VM: [email protected]://java.sun.com/" at: #-9 sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) #-8 sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) #-7 sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) #-6 java.lang.reflect.Method.invoke(Unknown Source) #-5 php.java.bridge.JavaBridge.Invoke(JavaBridge.java:1044) #-4 php.java.bridge.Request.handleRequest(Request.java:417) #-3 php.java.bridge.Request.handleRequests(Request.java:500) #-2 php.java.bridge.http.ContextRunner.run(ContextRunner.java:145) #-1 php.java.bridge.ThreadPool$Delegate.run(ThreadPool.java:60) #0 http://localhost:8080/JavaBridgeTemplate621/java/Java.inc(232): java_ThrowExceptionProxyFactory->getProxy(7, 'com.mathworks.t...', 'T', true) #1 http://localhost:8080/JavaBridgeTemplate621/java/Java.inc(360): java_Arg->get in http://localhost:8080/JavaBridgeTemplate621/java/Java.inc on line 195

我不明白什麼是必須要做的這裏。

編輯: - @ renick-您好我使用的Caucho櫟和寫的PHP文件 「testjava.php」 如下: -

$myclass=new Java("themagic.theMagic"); 
$input = new Java("java.lang.Double", 5); 
$output=new Java("java.lang.Integer",1); 
$result=new Java("java.lang.Object"); 
$n=new Java("com.mathworks.toolbox.javabuilder.MWNumericArray",$input,MWClassID.DOUBLE); 
$result=$myclass->makesqr($output,$n); 

現在,當我把這個文件稱爲「本地主機:8080/testjava .PHP」。我得到以下錯誤:

HTTP Status 500 - 

type Exception report 

message 

description The server encountered an internal error() that prevented it from fulfilling this request. 

exception 

com.caucho.quercus.QuercusException: themagic.theMagic.makesqr: null 
    com.caucho.quercus.env.JavaMethod.invoke(JavaMethod.java:131) 
    com.caucho.quercus.env.JavaInvoker.callMethod(JavaInvoker.java:737) 
    com.caucho.quercus.env.JavaOverloadMethod.callMethod(JavaOverloadMethod.java:179) 
    com.caucho.quercus.program.JavaClassDef.callMethod(JavaClassDef.java:658) 
    com.caucho.quercus.env.JavaValue.callMethod(JavaValue.java:327) 
    com.caucho.quercus.expr.AbstractMethodExpr.eval(AbstractMethodExpr.java:97) 
    com.caucho.quercus.expr.ObjectMethodExpr.eval(ObjectMethodExpr.java:97) 
    com.caucho.quercus.expr.AbstractMethodExpr.evalCopy(AbstractMethodExpr.java:63) 
    com.caucho.quercus.expr.BinaryAssignExpr.eval(BinaryAssignExpr.java:88) 
    com.caucho.quercus.expr.Expr.evalTop(Expr.java:523) 
    com.caucho.quercus.statement.ExprStatement.execute(ExprStatement.java:67) 
    com.caucho.quercus.statement.BlockStatement.execute(BlockStatement.java:105) 
    com.caucho.quercus.program.QuercusProgram.execute(QuercusProgram.java:413) 
    com.caucho.quercus.page.InterpretedPage.execute(InterpretedPage.java:89) 
    com.caucho.quercus.env.Env.executePageTop(Env.java:3951) 
    com.caucho.quercus.env.Env.executeTop(Env.java:3892) 
    com.caucho.quercus.servlet.QuercusServletImpl.service(QuercusServletImpl.java:188) 
    com.caucho.quercus.servlet.QuercusServlet.service(QuercusServlet.java:594) 
    javax.servlet.http.HttpServlet.service(HttpServlet.java:717) 
root cause 

java.lang.NullPointerException 
    com.mathworks.toolbox.javabuilder.internal.MWMCR.invoke(MWMCR.java:492) 
    themagic.theMagic.makesqr(theMagic.java:158) 
    sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) 
    sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) 
    java.lang.reflect.Method.invoke(Unknown Source) 
    com.caucho.quercus.env.JavaMethod.invoke(JavaMethod.java:117) 
    com.caucho.quercus.env.JavaInvoker.callMethod(JavaInvoker.java:737) 
    com.caucho.quercus.env.JavaOverloadMethod.callMethod(JavaOverloadMethod.java:179) 
    com.caucho.quercus.program.JavaClassDef.callMethod(JavaClassDef.java:658) 
    com.caucho.quercus.env.JavaValue.callMethod(JavaValue.java:327) 
    com.caucho.quercus.expr.AbstractMethodExpr.eval(AbstractMethodExpr.java:97) 
    com.caucho.quercus.expr.ObjectMethodExpr.eval(ObjectMethodExpr.java:97) 
    com.caucho.quercus.expr.AbstractMethodExpr.evalCopy(AbstractMethodExpr.java:63) 
    com.caucho.quercus.expr.BinaryAssignExpr.eval(BinaryAssignExpr.java:88) 
    com.caucho.quercus.expr.Expr.evalTop(Expr.java:523) 
    com.caucho.quercus.statement.ExprStatement.execute(ExprStatement.java:67) 
    com.caucho.quercus.statement.BlockStatement.execute(BlockStatement.java:105) 
    com.caucho.quercus.program.QuercusProgram.execute(QuercusProgram.java:413) 
    com.caucho.quercus.page.InterpretedPage.execute(InterpretedPage.java:89) 
    com.caucho.quercus.env.Env.executePageTop(Env.java:3951) 
    com.caucho.quercus.env.Env.executeTop(Env.java:3892) 
    com.caucho.quercus.servlet.QuercusServletImpl.service(QuercusServletImpl.java:188) 
    com.caucho.quercus.servlet.QuercusServlet.service(QuercusServlet.java:594) 
    javax.servlet.http.HttpServlet.service(HttpServlet.java:717) 
note The full stack trace of the root cause is available in the Apache Tomcat/6.0.32 logs. 

Apache Tomcat/6.0.32 

有沒有人有任何想法,我在做什麼錯?

注:我不知道的Java的一個字,但我堅持的情況下,我必須處理這個

+0

非常感謝大家,但以上建議都沒有爲我工作。我最終採取在Java中編寫整個事情,而不是使用任何類型的PHP Java橋...謝謝 – Rasmus 2011-05-31 12:29:55

+0

多少是Matlab JA生成器這值得嗎?你知道任何其他免費軟件替代品嗎? – Gevorg 2011-08-12 20:32:06

回答

0

我會建議以另一種方式實現這一點。 由於你已經有了一個tomcat web容器,我建議你可以試試Caucho Quercus這是一個Java虛擬機上的PHP實現。

特別參見this documentation example調用Java代碼是多麼容易。

0

你的Matlab函數期望Integer而不是Double。您提供雙輸入。我希望這會解決你的問題。這不是PHP的Java橋接問題。

+0

整數也是一個整數。 – Raffael 2011-05-24 07:50:52

+0

沒有,不工作 – Rasmus 2011-05-24 07:53:39

0

爲什麼不擴展您的java代碼將其輸出到標準輸出或文件中,然後使用系統命令執行您的java程序並捕獲輸出或從文件中讀取它?

+0

感謝您的回覆,但我不知道java的..我已被給予一個jar文件,並必須在PHP中調用它的功能..所以這個選項排除了我,我可以寫了在Java本身的應用程序... – Rasmus 2011-05-24 08:06:44

0

問題是參數的類型。

int(原始類型)是必需的。 對象是必需的。

這樣:

嘗試使用原始的第一個參數不是「java.lang中。整數」 - >‘INT’

和/或

變化‘com.mathworks.toolbox.javabuilder.MWNumericArray’爲一種類型的適用於雙人或浮動(它似乎是用於陣列)

0

你也可以使用一個簡單的方法一樣,調用一個jar文件:

<?php 
    $output = shell_exec("java -jar themagic.jar $parameter"); 
    echo $output; 
?> 
+0

哈哈哈。 Java-PHP橋由2行過時。 :) – 2011-06-16 15:37:15

1

既然你已經安裝了一個罐子和Tomcat可以也許只是把它包裝成一個Web服務撰寫小。 servl等映射到這個類,你可以從PHP捲曲,並獲得JSON格式的輸出。 (你可以在包裝代碼中使用Matlab方法的輸出,轉換成json並將答案發回)。

這會在發送和接收數據時釋放所有類型的轉換。查看RestEasy可以更簡單地發送參數。雖然對於簡單的應用程序,但將cast轉換爲所需類型的request.getparameter()效果很好。