Matlab, PHP и Java
Я пытаюсь создать веб-приложение, которое использует функцию Matlab с использованием PHP/Java Bridge. Позвольте мне объяснить:
- Мне нужно написать функцию в matlab
- преобразовать функцию в файл jar с помощью matlab ja builder
- Используйте PHP/Java Bridge для вызова этой функции в php и отображения результатов.
До сих пор я это делал. Я создал очень простой файл Matlab с именем "makeqr.m", который выглядит следующим образом:
function y=makesqr(x)
y = magic(x);
end
Я упаковал это в файл jar с именем "themagic.jar", используя Jab.
Установленный 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);
?>
Я просто получаю эту ошибку:
Uncaught [[o: Exception]: "java.lang.Exception: Invoke failed: [[o: mksqr]] → makeqr ((o: int) [o: Integer], (o: Object;) [ o: MWNumericArray]). Причина: java.lang.IllegalArgumentException: несоответствие типа аргумента VM: [email protected]://java.sun.com/" at: # -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, но я застрял в ситуации, когда мне приходится обрабатывать этот
Ответы
Ответ 1
Поскольку у вас уже установлена банка и tomcat. Возможно, вы можете просто вложить его в веб-сервис. Напишите небольшой сервлет, сопоставленный этому классу, и вы можете зависать от php и получать отформатированный формат json. (вы можете вывести метод Matlab в свой код оболочки, преобразовать в json и отправить ответ).
Это освободит вас от всех типов конверсий, как при отправке, так и при получении данных. Посмотрите RestEasy для еще более простого способа отправки аргументов. Хотя для простых приложений request.getparameter() с литой до желаемого типа отлично работает.
Ответ 2
Я предлагаю альтернативный способ реализовать это.
Поскольку у вас уже есть контейнер tomcat, я бы предположил, что вы можете попробовать Caucho Quercus, который является реализацией PHP на виртуальной машине Java.
См. особенно этот пример документации, как легко вызвать код Java.
Ответ 3
Функция Matlab ожидает Integer вместо Double. Вы предоставляете ввод как двойной. Я надеюсь, что это решит проблему ур. Это не проблема Java-моста с PHP.
Ответ 4
Почему бы просто не расширить свой Java-код для вывода его на stdout или в файл, а затем использовать системную команду для выполнения вашей java-программы и захватить вывод или прочитать его из файла?
Ответ 5
Проблема - это тип аргументов.
int (примитивный тип).
Требуется объект.
так:
попробуйте использовать примитив для первого аргумента, а не "java.lang.Integer" → "int"
и/или
изменить "com.mathworks.toolbox.javabuilder.MWNumericArray" для типа, адаптированного для Double или Float (он, по-видимому, используется для массива)
Ответ 6
Вы также можете вызвать файл jar, используя простой способ:
<?php
$output = shell_exec("java -jar themagic.jar $parameter");
echo $output;
?>