2011-05-21 29 views
11

Estoy tratando de crear una aplicación web que utiliza una función de Matlab utilizando un puente PHP/Java. Me explico:Matlab, PHP y Java

  1. tengo que escribir la función en Matlab
  2. convertir la función en un archivo JAR utilizando el constructor MATLAB ja
  3. Usar un PHP/Java Puente de llamar a esta función en php y visualización resultados.

Hasta ahora he hecho esto. He creado un archivo de Matlab muy simple llamado "makesqr.m", que es la siguiente:

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

Empaqueté esto en un archivo jar llamado "themagic.jar" Matlab constructor JA. Instalado Tomcat y PHP/Java Puente y escribió una función PHP que llama a la func makesqr así:

<?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); 
?> 

cada vez me siento este 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: [email protected]://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

No entiendo lo que hay que hacer aquí.

Editar: - @ renick- Hola He utilizado el quercus caucho y escribió el archivo php "testjava.php" de la siguiente manera: -

$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); 

Ahora cuando llamo a este archivo como "localhost: 8080/testjava .php ". Me aparece el siguiente 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 

¿Alguien podría tener alguna idea de lo que estoy haciendo mal?

Nota: Yo no sé una palabra de Java, pero estoy atascado en una situación en la que tengo que manejar esto

+0

Bueno, gracias a todos ustedes, pero ninguna de las sugerencias anteriores funcionó para mí. En última instancia, recurrí a escribir todo esto en Java en lugar de utilizar cualquier tipo de puente php java ... gracias – Rasmus

+0

¿Cuánto cuesta Matlab JA Builder? ¿Y vale la pena? ¿Conoces otras alternativas de freeware? – Gevorg

Respuesta

0

voy a sugerir una forma alternativa de implementar esto. Como ya tiene un contenedor web de tomcat, le sugiero que desee probar Caucho Quercus que es una implementación de PHP en la máquina virtual de Java.

Ver especialmente this documentation example qué fácil es llamar al código de Java.

0

Su función Matlab espera Número entero en lugar de Doble. Está proporcionando entrada como Doble. Espero que esto solucione tu problema. Este no es el problema del puente de Java con PHP.

+0

Un número entero también es un doble. – Raffael

+0

No, eso no funciona – Rasmus

0

¿por qué no extender su código java para enviarlo a stdout o a un archivo, y luego usar un comando del sistema para ejecutar su programa java y capturar el resultado o leerlo de un archivo?

+0

Gracias por responder pero no conozco java en absoluto ... Me han dado un archivo jar y tengo que llamar a su función en php ... por lo que esta opción se descarta para mí, de lo contrario podría haber escrito el aplicación en Java en sí ... – Rasmus

0

El problema es el tipo de argumentos.

int (tipo primitivo) es obligatorio. Se requiere un objeto.

manera:

tratar de utilizar primitiva para el primer argumento no es el "java.lang.Entero" -> "int"

y/o

cambio "com.mathworks.toolbox.javabuilder.MWNumericArray" para un tipo adaptado para doble o flotador (parece que se utilizará para Array)

0

también puede llamar a un archivo jAR utilizando una forma fácil de esa manera:.

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

jajaja. Puente Java-PHP hecho obsoleto con 2 líneas. :) –

1

como usted ya tiene un frasco y Tomcat instalado, puede tal vez sólo se envuelve en un servicio web escribir un pequeño. servl y mapeado a esta clase y puede curl de php y obtener un formato de salida json. (Puede tomar el resultado del método Matlab en su código contenedor, convertir a json y enviar la respuesta).

Esto le liberará de todas las conversiones de tipo, tanto al enviar como al recibir datos. Mira en RestEasy para una forma aún más fácil de enviar argumentos. Aunque para aplicaciones simples, request.getparameter() con un molde para el tipo deseado funciona muy bien.