Matlab、PHP 和爪哇
我正在尝试创建一个使用 PHP/Java 桥的 Matlab 函数的 Web 应用程序。让我解释一下:
- 我需要在 matlab 中编写函数,
- 使用 matlab ja 构建器将函数转换为 jar 文件。
- 使用 PHP/Java 桥在 php 中调用此函数并显示结果。
到目前为止我已经做到了这一点。我创建了一个非常简单的名为“makesqr.m”的 Matlab 文件,如下所示:
function y=makesqr(x)
y = magic(x);
end
我使用 Matlab 构建器 JA 将其打包到名为“themagic.jar”的 jar 文件中。 安装了 Tomcat 和 PHP/Java Bridge 并编写了一个 php 函数,该函数调用 makeqr 函数,如下所示:
<?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);
?>
我只是不断收到此错误:
未捕获的 [[o:Exception]:"java.lang.Exception: 调用失败: [[o:mksqr]]->makesqr((o:int)[o:Integer], (o:Object;) [o:MWNumericArray])。原因:java.lang.IllegalArgumentException:参数类型不匹配VM:1.6.0_25@http://java.sun.com/”位于:#-9 sun.reflect.NativeMethodAccessorImpl.invoke0(本机方法) ) #-8 sun.reflect.NativeMethodAccessorImpl.invoke(未知来源) #-7 sun.reflect.DelegatingMethodAccessorImpl.invoke(未知来源) #-6 java.lang.reflect.Method.invoke(未知来源) #-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->获取 http://localhost:8080/JavaBridgeTemplate621/java/Java.inc 第 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,但我陷入了必须处理这个问题的境地
I am trying to create a web app which uses a Matlab function using a PHP/Java Bridge. Let me explain:
- I need to write the function in matlab
- convert the function into a jar file using the matlab ja builder
- Use a PHP/Java Bridge to call this function in php and display results.
So far I have done this. I created a very simple Matlab file named "makesqr.m" which is as below:
function y=makesqr(x)
y = magic(x);
end
I packaged this into a jar file named "themagic.jar" using Matlab builder JA.
Installed Tomcat and PHP/Java Bridge and wrote a php function which calls the makesqr func like this:
<?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);
?>
I just keep getting this error:
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
I dont understand what is to be done here.
Edit:-@renick- Hi I used the caucho quercus and wrote the php file"testjava.php" as below:-
$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);
Now when I call this file as "localhost:8080/testjava.php". I get the below error:
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
Would anyone have any idea as to what I am doing wrong?
Note: I dont know a word of Java but am stuck in a situation where I have to handle this
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(6)
因为你已经安装了 jar 和 tomcat。您也许可以将其包装到网络服务中。编写一个映射到此类的小 servlet,您可以从 php 进行curl 并获得 json 格式的输出。 (您可以在包装器代码中获取 Matlab 方法的输出,转换为 json 并将答案发回)。
这将使您在发送和接收数据时免于所有类型转换。查看 RestEasy 以获得更简单的发送参数的方法。尽管对于简单的应用程序来说,将 request.getparameter() 强制转换为所需类型效果很好。
Since you already have a jar and tomcat installed. You can maybe just wrap it into a web-service. Write a small servlet mapped to this class and you can curl from php and get a json formatted output. (you can take the Matlab method's output in your wrapper code, convert to json and send the answer back).
This will free you of all type conversions, both while sending and receiving data. Look into RestEasy for an even easier way of sending arguments. Although for simple applications, request.getparameter() with a cast to desired type works great.
我将建议一种替代方法来实现这一点。
由于您已经有一个 tomcat Web 容器,我建议您尝试 Caucho Quercus 这是一个 PHP 实现在Java虚拟机上。
特别请参阅此文档示例调用是多么容易转换成Java代码。
I will suggest an alternative way to implement this.
Since you already have a tomcat web container I would suggest that you may want to try Caucho Quercus which is a PHP implementation on the Java Virtual Machine.
See especially this documentation example how easy it is to call into Java code.
您的 Matlab 函数需要 Integer 而不是 Double。您提供的输入为 Double。我希望这能解决你的问题。这不是 PHP 的 java 桥接问题。
Your Matlab function is expecting Integer instead of Double. You are providing input as Double. I hope this will solve ur problem. This is not java bridge problem with PHP.
为什么不直接扩展您的 java 代码以将其输出到 stdout 或文件中,然后使用系统命令来执行您的 java 程序并捕获输出或从文件中读取它?
why not just extend your java-code to output it to stdout or into a file, then use a system command to execute your java program and catch the output or read it from a file?
问题在于参数的类型。
int(原始类型)是必需的。
需要对象。
所以:
尝试使用原语作为第一个参数而不是“java.lang.Integer”-> “int”
和/或
将“com.mathworks.toolbox.javabuilder.MWNumericArray”更改为适用于 Double 或 Float 的类型(它似乎用于数组)
The problem is the type of arguments.
int (primitive type) is required.
Object is required.
so :
try to use primitive for the first argument not the "java.lang.Integer" -> "int"
and / or
change "com.mathworks.toolbox.javabuilder.MWNumericArray" for a type adapted for Double or Float (it seems to be used for Array)
您还可以使用简单的方法调用 jar 文件,如下所示:
You can also call a jar file using a easy way like that: