【发布时间】:2014-10-01 08:39:34
【问题描述】:
我在一个 Android 项目中使用 JavaCV 来处理一些图像。 我成功地使用 JavaCV 的本机库创建了纯 Java 项目,并且该应用程序运行良好。 然后我想尝试将项目移植到 Groovy for Android:
- 我按照此处显示的说明进行操作:https://speakerdeck.com/glaforge/groovy-on-android-droidcon-paris-2014
- 我将所有 .java 文件的扩展名替换为 .groovy。 项目构建并运行良好(耶!)直到对 Javacv 库的本机调用,然后我得到这个讨厌的异常:
java.lang.NoClassDefFoundError: java/awt/image/BufferedImage 在 java.lang.Class.getDeclaredMethods(本机方法) 在 java.lang.Class.getDeclaredMethods(Class.java:703) 在 org.codehaus.groovy.reflection.stdclasses.CachedSAMClass$1.run(CachedSAMClass.java:100) 在 org.codehaus.groovy.reflection.stdclasses.CachedSAMClass$1.run(CachedSAMClass.java:98) 在 java.security.AccessController.doPrivileged(AccessController.java:45) 在 org.codehaus.groovy.reflection.stdclasses.CachedSAMClass.getDeclaredMethods(CachedSAMClass.java:98) 在 org.codehaus.groovy.reflection.stdclasses.CachedSAMClass.getAbstractMethods(CachedSAMClass.java:116) 在 org.codehaus.groovy.reflection.stdclasses.CachedSAMClass.getSAMMethod(CachedSAMClass.java:182) 在 org.codehaus.groovy.reflection.ClassInfo.isSAM(ClassInfo.java:344) 在 org.codehaus.groovy.reflection.ClassInfo.createCachedClass(ClassInfo.java:334) 在 org.codehaus.groovy.reflection.ClassInfo.access$700(ClassInfo.java:38) 在 org.codehaus.groovy.reflection.ClassInfo$LazyCachedClassRef.initValue(ClassInfo.java:482) 在 org.codehaus.groovy.reflection.ClassInfo$LazyCachedClassRef.initValue(ClassInfo.java:473) 在 org.codehaus.groovy.util.LazyReference.getLocked(LazyReference.java:46) 在 org.codehaus.groovy.util.LazyReference.get(LazyReference.java:33) 在 org.codehaus.groovy.reflection.ClassInfo.getCachedClass(ClassInfo.java:108) 在 org.codehaus.groovy.reflection.ReflectionCache.getCachedClass(ReflectionCache.java:107) 在 org.codehaus.groovy.reflection.CachedClass$4.initValue(CachedClass.java:136) 在 org.codehaus.groovy.reflection.CachedClass$4.initValue(CachedClass.java:133) 在 org.codehaus.groovy.util.LazyReference.getLocked(LazyReference.java:46) 在 org.codehaus.groovy.util.LazyReference.get(LazyReference.java:33) 在 org.codehaus.groovy.reflection.CachedClass.getCachedSuperClass(CachedClass.java:243) 在 org.codehaus.groovy.reflection.CachedClass$8.initValue(CachedClass.java:209) 在 org.codehaus.groovy.reflection.CachedClass$8.initValue(CachedClass.java:195) 在 org.codehaus.groovy.util.LazyReference.getLocked(LazyReference.java:46) 在 org.codehaus.groovy.util.LazyReference.get(LazyReference.java:33) 在 org.codehaus.groovy.reflection.CachedClass.getInterfaces(CachedClass.java:247) 在 org.codehaus.groovy.reflection.CachedClass.(CachedClass.java:233) 在 org.codehaus.groovy.reflection.ClassInfo.createCachedClass(ClassInfo.java:337) 在 org.codehaus.groovy.reflection.ClassInfo.access$700(ClassInfo.java:38) 在 org.codehaus.groovy.reflection.ClassInfo$LazyCachedClassRef.initValue(ClassInfo.java:482) 在 org.codehaus.groovy.reflection.ClassInfo$LazyCachedClassRef.initValue(ClassInfo.java:473) 在 org.codehaus.groovy.util.LazyReference.getLocked(LazyReference.java:46) 在 org.codehaus.groovy.util.LazyReference.get(LazyReference.java:33) 在 org.codehaus.groovy.reflection.ClassInfo.getCachedClass(ClassInfo.java:108) 在 org.codehaus.groovy.reflection.ReflectionCache.getCachedClass(ReflectionCache.java:107) 在 org.codehaus.groovy.reflection.ParameterTypes.getParametersTypes0(ParameterTypes.java:78) 在 org.codehaus.groovy.reflection.ParameterTypes.getParameterTypes(ParameterTypes.java:64) 在 org.codehaus.groovy.reflection.CachedMethod.compareToCachedMethod(CachedMethod.java:154) 在 org.codehaus.groovy.reflection.CachedMethod.compareTo(CachedMethod.java:137) 在 java.util.ComparableTimSort.binarySort(ComparableTimSort.java:228) 在 java.util.ComparableTimSort.sort(ComparableTimSort.java:172) 在 java.util.ComparableTimSort.sort(ComparableTimSort.java:142) 在 java.util.Arrays.sort(Arrays.java:1973) 在 org.codehaus.groovy.reflection.CachedClass$3.initValue(CachedClass.java:117) 在 org.codehaus.groovy.reflection.CachedClass$3.initValue(CachedClass.java:79) 在 org.codehaus.groovy.util.LazyReference.getLocked(LazyReference.java:46) 在 org.codehaus.groovy.util.LazyReference.get(LazyReference.java:33) 在 org.codehaus.groovy.reflection.CachedClass.getMethods(CachedClass.java:255) 在 groovy.lang.MetaClassImpl.populateMet
这是使用 Javacv 的代码 sn-p:
FFmpegFrameRecorder recorder = new FFmpegFrameRecorder(outFile, width, height);
recorder.setVideoCodec(avcodec.AV_CODEC_ID_MPEG4);
recorder.setFormat("mp4");
recorder.setFrameRate(frameRate);
recorder.setVideoQuality(videoQuality);
/* some non Javacv stuff */
while(!finished)
{
opencv_core.IplImage image = cvLoadImage(picPath);
recorder.record(image);
opencv_core.cvReleaseImage(image);
}
我知道 Android 不附带 AWT,但就普通的 Java 项目而言,这不是问题。我只有在使用 Groovy 时才会遇到这个问题。我整个上午都在尝试解决这个问题,但没有运气,还尝试将生成的调试 apk 通过 Proguard 传递,但这只会造成更多的混乱。 任何想法如何解决这个问题?
【问题讨论】: