java - Matlab、PHP 和 Java

标签 java php matlab

我正在尝试创建一个网络应用程序,该应用程序使用 Matlab 函数和 PHP/Java 桥接器。让我解释一下:

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

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

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

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

<?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: 1.6.0_25@http://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 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。你也许可以把它包装成一个网络服务。编写一个映射到此类的小 servlet,您可以从 php curl 并获得 json 格式的输出。 (您可以在包装代码中获取 Matlab 方法的输出,转换为 json 并将答案发回)。

这将使您在发送和接收数据时免于所有类型转换。查看RestEasy一种更简单的发送参数的方法。尽管对于简单的应用程序,将 request.getparameter() 转换为所需类型的方法效果很好。

关于java - Matlab、PHP 和 Java,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6080780/

相关文章:

matlab - 检查正方形是否落在三角形内的最简单/有效的方法

java - 在 spring boot 应用程序中使用 RabbitMQ 进行分布式事务

java - 快速查询 StringOutOfBoundsException

php - 在 PHP 中从另一个函数调用一个函数

algorithm - 修改 Delaunay 三角剖分的有效方法

matlab - 为什么不是球形图?如何在 Matlab 中绘制 3D 极坐标图?

java - Openssl 未被识别为内部或外部命令

java - 哪个是最优的?

php - 检查文件(robots.txt,favicon.ico)到网站 php

php - 如何使用 PHPUnit 的模拟测试名为 "method()"的方法?