Tengo un problema que me está volviendo loco. Matlab sólo ve algunas de mis clases embebidos en un archivo JARMatlab no puede ver algunas de mis clases de Java (no todas) en el paquete jar
Si puedo compilar las clases fuera de un paquete y añadir la ruta de la clase en Matlab usando javaaddpath, no me encontré con ningún problema
Cuando compilar la clase en un paquete y luego intentar acceder a ellos bajo Matlab, tengo problemas. Debajo de algunos códigos de Matlab
javaaddpath('/Users/me/Documents/workspace/EKGTest.jar');
clear java
import com.neurosky.thinkgear.*
methods('EkgSense')
Methods for class com.neurosky.thinkgear.EkgSense:
EkgSense getClass notify reset
addTemplate getClassificationResults notifyAll toString
equals hashCode processData wait
methods('EkgEpoch')
No methods for class EkgEpoch or no class EkgEpoch
Ahora, miro en el paquete, todas las clases son públicas. Este es el resultado de la jarra -tf
osx:/Users/me/Documents/workspace> jar tf EKGTest.jar
META-INF/MANIFEST.MF
META-INF/REFACTORINGS.XML
com/
com/neurosky/
com/neurosky/thinkgear/
com/neurosky/thinkgear/EkgEpoch.class
com/neurosky/thinkgear/EkgEpoch.java
com/neurosky/thinkgear/EkgParameters.class
com/neurosky/thinkgear/EkgParameters.java
com/neurosky/thinkgear/EkgTemplate.class
com/neurosky/thinkgear/EkgTemplate.java
com/neurosky/thinkgear/Matlab.class
com/neurosky/thinkgear/Matlab.java
com/neurosky/thinkgear/EkgSense.class
com/neurosky/thinkgear/EkgSense.java
com/neurosky/thinkgear/DistanceArray.class
com/neurosky/thinkgear/DistanceArray.java
y por debajo de javap --classpath
osx:/Users/me/Documents/workspace> javap -classpath /Users/me/Documents/workspace/EKGTest.jar com.neurosky.thinkgear.EkgEpoch
Compiled from "EkgEpoch.java"
public class com.neurosky.thinkgear.EkgEpoch extends java.lang.Object implements java.lang.Cloneable{
public int numberOfSamples;
public float[] data;
public com.neurosky.thinkgear.EkgEpoch(int);
public com.neurosky.thinkgear.EkgEpoch(int, float[]);
public com.neurosky.thinkgear.EkgEpoch(float[]);
public com.neurosky.thinkgear.EkgEpoch(com.neurosky.thinkgear.EkgEpoch);
public com.neurosky.thinkgear.EkgEpoch(org.json.JSONArray);
public org.json.JSONArray toJSONArray();
public static float[] convolve(float[], float[]);
public float getLineNoiseAmplitude();
public com.neurosky.thinkgear.EkgEpoch subtract(com.neurosky.thinkgear.EkgEpoch);
public com.neurosky.thinkgear.EkgEpoch subEpoch(int, int);
public com.neurosky.thinkgear.EkgEpoch square();
public com.neurosky.thinkgear.EkgEpoch subtract(float);
public com.neurosky.thinkgear.EkgEpoch diff();
public boolean exceedValue(float, int, int);
public com.neurosky.thinkgear.EkgEpoch smooth(int);
public float mean();
public float sum();
public float max();
public float median();
public com.neurosky.thinkgear.EkgEpoch clone();
public com.neurosky.thinkgear.EkgEpoch sort();
public int[] sortIndices(com.neurosky.thinkgear.EkgEpoch);
public float std();
public int find_heart_beats(int[], float);
public com.neurosky.thinkgear.EkgEpoch detrend();
public java.lang.Object clone() throws java.lang.CloneNotSupportedException;
}
osx:/Users/me/Documents/workspace> javap -classpath /Users/me/Documents/workspace/EKGTest.jar com.neurosky.thinkgear.EkgSense
Compiled from "EkgSense.java"
public class com.neurosky.thinkgear.EkgSense extends java.lang.Object{
public com.neurosky.thinkgear.EkgParameters params;
public com.neurosky.thinkgear.EkgTemplate[] templates;
public com.neurosky.thinkgear.EkgTemplate currentData;
public int lastTemplateInd;
public float lastEpochValue;
public com.neurosky.thinkgear.EkgSense(com.neurosky.thinkgear.EkgParameters);
public void reset();
public void addTemplate(java.lang.String, float[][]);
public void addTemplate(com.neurosky.thinkgear.EkgTemplate);
public java.lang.String getClassificationResults();
public boolean processData(float[]);
}
Me postulo Matlab en OSX. Lo he intentado con Matlab 7.7.0.471 (R2008b) y 7.11.0.584 (R2010b) y tengo el mismo problema. Ambos Matlab están utilizando el OSX Java nativo (Java 1.6.0_26-b03-384-10M3425 con el modo mixto de Apple Inc. Java HotSpot (TM) 64-Bit Server) que debería ser el mismo que el de Eclipse (he comprobado y Eclipse compila con 1.6).
Recuerda que puedo ver la clase que falta sin problemas cuando elimino la instrucción del paquete y algunas importaciones en la parte superior de los archivos java (en todas las clases, por supuesto) y cuando simplemente agrego la ruta a los archivos .class (no acceder a ellos en un archivo JAR).
Cualquier ayuda sería muy apreciada. Gracias ,
Jason
Si has encontrado una solución, lo puso en una respuesta y lo acepta tú mismo. De esa forma, otros lo encontrarán más fácilmente. –