我有一个让我发疯的问题。Matlab仅看到我的某些类嵌入到JAR文件中
如果我在包外部编译类,并使用javaaddpath在Matlab中添加类的路径,则不会遇到任何问题
当我在一个包中编译该类,然后尝试在Matlab下访问它们时,出现了问题。下面是一些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
现在,在包装中,所有类都是公共的。这是由于jar -tf
jar -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
及以下 javap --classpath
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[]); }
我在OSX上运行Matlab。我已经尝试过使用Matlab 7.7.0.471(R2008b)和7.11.0.584(R2010b),并遇到相同的问题。两种Matlab都使用本机OSX Java(具有Apple Inc. Java HotSpot(TM)64位服务器VM混合模式的Java 1.6.0_26-b03-384-10M3425)应与Eclipse中的相同(我已经检查过)和Eclipse用1.6编译)。
请记住,删除包语句和Java文件顶部的某些导入(当然,在所有类中)时,以及仅将路径添加到.class文件(不访问它们)时,我都能看到丢失的类没有问题。在JAR文件中)。
任何帮助将不胜感激。谢谢,
杰森
我最终发现了上面无法看到的问题。问题(在任何地方都没有记录)是我的某些类使用了未导入Matlab的外部包。我没有计划使用与这些软件包相关的任何功能。
但是,找不到该类的Matlab错误消息令人困惑。一条错误消息指出该类不能使用,因为未引用某些程序包将是最有用的。
如果您的程序包使用外部程序包,请确保在Java类路径中包括所有相关的jar文件,否则Matlab将看不到您的依赖类。
我发现有用的另一个技巧是,如果您输入了不存在的程序包,例如import java.doesnotexist.*工作正常,Matlab函数“导入”将不会返回错误。但是,import java.doesnotexist.aclass将无法正常工作。
import java.doesnotexist.*
import java.doesnotexist.aclass