首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Matlab、PHP和Java

Matlab、PHP和Java
EN

Stack Overflow用户
提问于 2011-05-21 09:12:39
回答 6查看 1.5K关注 0票数 11

我正在尝试创建一个web应用程序,它使用一个使用PHP/Java的Matlab函数。让我解释一下:

  1. 我需要用matlab编写函数。
  2. 使用matlab ja builder将函数转换为jar文件。
  3. 使用PHP/Java在php中调用此函数并显示结果。

到目前为止我已经做了这件事。我创建了一个非常简单的名为"makesqr.m“的Matlab文件,如下所示:

代码语言:javascript
复制
 function y=makesqr(x)
   y = magic(x);
 end

我使用Matlab将其打包到一个名为"themagic.jar“的jar文件中。安装了Tomcat和PHP/Java,并编写了一个php函数,该函数调用makesqr,如下所示:

代码语言:javascript
复制
<?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”如下:

代码语言:javascript
复制
$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“时。我得到以下错误:

代码语言:javascript
复制
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的一个字,但是我陷入了不得不处理这个问题的境地。

EN

回答 6

Stack Overflow用户

发布于 2011-06-23 17:18:24

因为你已经安装了一个罐子和tomcat。你可以把它打包成一个网络服务。编写一个映射到该类的小servlet,您可以从php中滚动并获得一个json格式的输出。(您可以在包装代码中获取Matlab方法的输出,转换为json并将答案发回。)

这将释放您的所有类型的转换,同时发送和接收数据。查看RestEasy,寻找一种更容易发送参数的方法。尽管对于简单的应用程序,具有强制转换到所需类型的request.getparameter()工作得很好。

票数 1
EN

Stack Overflow用户

发布于 2011-05-21 09:22:25

我将建议另一种方法来实现这一点。由于您已经有了一个tomcat容器,所以我建议您尝试一下考丘栎,这是Java上的一个PHP实现。

特别要看到的是,此文档示例调用Java代码是多么容易。

票数 0
EN

Stack Overflow用户

发布于 2011-05-24 07:47:12

您的Matlab函数期望的是整数而不是双倍。您正在提供双倍的输入。我希望这能解决你的问题。这不是PHP的java桥问题。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6080780

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档