我正在尝试创建一个web应用程序,它使用一个使用PHP/Java的Matlab函数。让我解释一下:
到目前为止我已经做了这件事。我创建了一个非常简单的名为"makesqr.m“的Matlab文件,如下所示:
function y=makesqr(x)
y = magic(x);
end我使用Matlab将其打包到一个名为"themagic.jar“的jar文件中。安装了Tomcat和PHP/Java,并编写了一个php函数,该函数调用makesqr,如下所示:
<?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:整型,(o:Object;)o:MWNumericArray)。原因: sun.reflect.NativeMethodAccessorImpl.invoke0(Native : java.lang.IllegalArgumentException:参数类型错配VM: 1.6.0_25@http://java.sun.com/“at:#-9 php.java.bridge.JavaBridge.Invoke(JavaBridge.java:1044)方法( #-8 sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) #-7 sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) #-6 java.lang.reflect.Method.invoke(未知源) #-5 php.java.bridge.JavaBridge.Invoke(JavaBridge.java:1044) #-4 php.java.bridge.Requestphp.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:.handleRequest_ThrowExceptionProxyFactory->getProxy(7,‘com.mathworks.t.’,'T',真) #1 http://localhost:8080/JavaBridgeTemplate621/java/Java.inc(360:java_Arg->进入第195行的http://localhost:8080/JavaBridgeTemplate621/java/Java.inc
我不明白这里该做些什么。
编辑:-@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);现在,当我将这个文件称为"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的一个字,但是我陷入了不得不处理这个问题的境地。
发布于 2011-06-23 17:18:24
因为你已经安装了一个罐子和tomcat。你可以把它打包成一个网络服务。编写一个映射到该类的小servlet,您可以从php中滚动并获得一个json格式的输出。(您可以在包装代码中获取Matlab方法的输出,转换为json并将答案发回。)
这将释放您的所有类型的转换,同时发送和接收数据。查看RestEasy,寻找一种更容易发送参数的方法。尽管对于简单的应用程序,具有强制转换到所需类型的request.getparameter()工作得很好。
发布于 2011-05-21 09:22:25
我将建议另一种方法来实现这一点。由于您已经有了一个tomcat容器,所以我建议您尝试一下考丘栎,这是Java上的一个PHP实现。
特别要看到的是,此文档示例调用Java代码是多么容易。
发布于 2011-05-24 07:47:12
您的Matlab函数期望的是整数而不是双倍。您正在提供双倍的输入。我希望这能解决你的问题。这不是PHP的java桥问题。
https://stackoverflow.com/questions/6080780
复制相似问题