Ho un problema che mi sta facendo impazzire. Matlab vede solo alcune delle mie classi embeded in un file JARMatlab non può vedere alcune delle mie classi java (non tutte) nel pacchetto jar
Se compilo le classi al di fuori di un pacchetto e aggiungere il percorso della classe in Matlab utilizzando javaaddpath, non riscontra un problema
Quando ho compilare la classe in un pacchetto e quindi provare ad accedervi sotto Matlab, ho dei problemi. Sotto al codice 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
Ora, guardo nel pacchetto, tutte le classi sono pubbliche. Questo è il risultato di vaso -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
e al di sotto di 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[]);
}
Sono in esecuzione Matlab su OSX. Ho provato con Matlab 7.7.0.471 (R2008b) e 7.11.0.584 (R2010b) e ho avuto lo stesso problema. Entrambi Matlab utilizzano il Java OSX nativo (Java 1.6.0_26-b03-384-10M3425 con Apple Inc. Java HotSpot (TM) modalità VM server a 64 bit mista) che dovrebbe essere uguale a quello in Eclipse (ho controllato ed Eclipse si compila con 1.6).
Ricordare che non riesco a vedere la classe mancante nessun problema quando rimuovo l'istruzione del pacchetto e alcune importazioni nella parte superiore dei file java (in tutte le classi ovviamente) e quando aggiungo semplicemente il percorso ai file .class (non accedervi in un file JAR).
Qualsiasi aiuto sarebbe molto apprezzato. Grazie,
Jason
Se hai trovato una soluzione, mettete in una risposta e lo accetto te stesso. In questo modo, gli altri lo troveranno più facilmente. –