Matlab, PHP и Java - PullRequest
       1

Matlab, PHP и Java

11 голосов
/ 21 мая 2011

Я пытаюсь создать веб-приложение, которое использует функцию Matlab, используя PHP / Java Bridge. Позвольте мне объяснить:

  1. Мне нужно написать функцию в Matlab
  2. преобразовать функцию в файл jar с помощью matlab ja builder
  3. Используйте PHP / Java Bridge для вызова этой функции в php и отображения результатов.

Пока я сделал это. Я создал очень простой файл Matlab с именем «makeqr.m», который выглядит так:

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

Я упаковал это в файл jar с именем "themagic.jar", используя Matlab Builder JA. Установил 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: исключение]: "java.lang.Exception: сбой при вызове: [[o: mksqr]] -> makeqr ((o: int) [o: Integer], (o: Object;) [ o: MWNumericArray]). Причина: java.lang.IllegalArgumentException: несоответствие типа аргумента VM: 1.6.0_25@http://java.sun.com/" at: # -9 sun.reflect.NativeMethodAccessorImpl.invoke0 (собственный метод) # -8 sun.reflect.NativeMetorldA .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

Я не понимаю, что здесь делать.

Edit: - @ 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, но застрял в ситуации, когда я должен справиться с этим

Ответы [ 6 ]

1 голос
/ 23 июня 2011

Поскольку у вас уже установлены jar и tomcat. Вы можете просто обернуть это в веб-сервис. Напишите небольшой сервлет, сопоставленный с этим классом, и вы можете свернуться с php и получить вывод в формате json. (вы можете взять выходные данные метода Matlab в коде-обертке, преобразовать его в json и отправить ответ обратно).

Это освободит вас от всех преобразований типов, как при отправке, так и при получении данных. Посмотрите на RestEasy для еще более простого способа отправки аргументов. Хотя для простых приложений request.getparameter () с приведением к нужному типу отлично работает.

0 голосов
/ 06 июня 2011

Вы также можете вызвать файл JAR, используя простой способ:

<?php
   $output = shell_exec("java -jar themagic.jar $parameter");
   echo $output;
?>
0 голосов
/ 30 мая 2011

Проблема в типе аргументов.

int (тип примитива) требуется. Требуется объект.

так:

попробуйте использовать примитив для первого аргумента, а не для "java.lang.Integer" -> "int"

и / или

изменить "com.mathworks.toolbox.javabuilder.MWNumericArray" для типа, адаптированного для Double или Float (кажется, он используется для Array)

0 голосов
/ 24 мая 2011

почему бы просто не расширить свой java-код для вывода его на стандартный вывод или в файл, а затем использовать системную команду для выполнения вашей java-программы и перехватить вывод или прочитать его из файла?

0 голосов
/ 24 мая 2011

Ваша функция Matlab ожидает Integer вместо Double. Вы предоставляете ввод как Double. Я надеюсь, что это решит вашу проблему. Это не проблема Java-моста с PHP.

0 голосов
/ 21 мая 2011

Я предложу альтернативный способ реализации этого. Поскольку у вас уже есть веб-контейнер tomcat, я хотел бы предложить вам попробовать Caucho Quercus , который является реализацией PHP на виртуальной машине Java.

См. Особенно этот пример документации как легко вызывать код Java.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...