Matlab, PHP и Java

#java #php #matlab

#java #php #matlab

Вопрос:

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

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

До сих пор я делал это. Я создал очень простой файл Matlab с именем «makesqr.m», который выглядит следующим образом:

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

Я упаковал это в файл jar с именем «themagic.jar » используя Matlab Builder JA.
Установил Tomcat и PHP / Java Bridge и написал php-функцию, которая вызывает функцию makesqr следующим образом:

 <?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: Исключение]: «java.lang.Исключение: не удалось вызвать: [[o: mksqr]]->makesqr((o: int)[o:Integer], (o: Object;)[o:MWNumericArray]). Причина: java.lang.Исключение IllegalArgumentException: несоответствие типа аргумента виртуальной машине: 1.6.0_25@http://java.sun.com /» в: #-9 sun.reflect.NativeMethodAccessorImpl.invoke0 (собственный метод) #-8 sun.reflect.NativeMethodAccessorImpl.invoke (неизвестный источник) #-7 sun.reflect.Делегирование methodaccessorimpl.invoke(неизвестный источник) #-6 java.lang.reflect.Метод.invoke(неизвестный источник) #-5 php.java.bridge.JavaBridge.Вызвать (JavaBridge.java:1044) #-4 php.java.bridge.Запрос.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_throw exceptionproxyfactory->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, но застрял в ситуации, когда мне приходится с этим справляться

Комментарии:

1. Что ж, спасибо всем вам, но ни одно из вышеперечисленных предложений не сработало для меня. В конечном итоге я решил написать все это на Java, а не использовать какой-либо php java bridge… Спасибо

2. Сколько стоит Matlab JA Builder и стоит ли оно того? Знаете ли вы о каких-либо других бесплатных альтернативах??

Ответ №1:

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

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

Ответ №2:

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

Посмотрите, в частности, на этот пример документации, насколько легко вызывать Java-код.

Ответ №3:

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

Ответ №4:

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

Комментарии:

1. Спасибо за ответ, но я совсем не знаю Java.. Мне был предоставлен файл jar, и я должен вызвать его функцию на php .. так что этот вариант для меня исключен, иначе я мог бы написать приложение на самой Java…

Ответ №5:

Проблема заключается в типе аргументов.

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

итак :

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

и / или

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

Ответ №6:

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

 <?php
   $output = shell_exec("java -jar themagic.jar $parameter");
   echo $output;
?>