我正在尝试创建一个使用PHP/Java Bridge使用Matlab函数的Web应用程序。让我解释:
我需要在matlab中编写函数
使用matlab ja构建器
将函数转换为jar文件
使用PHP/Java Bridge在php中调用此函数并显示结果。
到目前为止,我已经做到了。我创建了一个非常简单的Matlab文件,名为“makesqr.m”,如下所示:
function y=makesqr(x)
y = magic(x);
end
我使用Matlab生成器JA将其打包到一个名为“themagic.jar”的jar文件中。
安装了Tomcat和PHP/Java Bridge,并编写了一个php函数,该函数像下面这样调用makeqr函数:
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
我不明白该怎么办。
编辑:[email protected] renick-嗨,我使用了caucho quercus并编写了如下所示的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);
现在,当我将此文件称为“localhost: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,但是在需要处理的情况下陷入困境
最佳答案
由于您已经安装了jar和tomcat。您也许可以将其包装到Web服务中。编写一个映射到此类的小servlet,您可以从php中 curl 并获得json格式的输出。 (您可以在包装代码中获取Matlab方法的输出,将其转换为json,然后将答案发送回去)。
在发送和接收数据的同时,这将使您摆脱所有类型的转换。查看RestEasy以获取一种更简单的发送参数的方法。尽管对于简单的应用程序,具有强制类型转换为所需类型的request.getparameter()很好用。