【问题标题】:Groovy for Android with JavaCV results in NoClassDefFoundError带有 JavaCV 的 Groovy for Android 导致 NoClassDefFoundError
【发布时间】:2014-10-01 08:39:34
【问题描述】:

我在一个 Android 项目中使用 JavaCV 来处理一些图像。 我成功地使用 JavaCV 的本机库创建了纯 Java 项目,并且该应用程序运行良好。 然后我想尝试将项目移植到 Groovy for Android:

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 传递,但这只会造成更多的混乱。 任何想法如何解决这个问题?

【问题讨论】:

    标签: android groovy javacv


    【解决方案1】:

    所以,我自己回答我的问题。 我花了几天时间才弄明白:我必须为所有使用原生库的方法添加 @CompileStatic 注解。

    值得注意的是,出于性能原因,建议(再次:https://speakerdeck.com/glaforge/groovy-on-android-droidcon-paris-2014)尽可能添加@CompileStatic。

    【讨论】:

      猜你喜欢
      • 2022-08-02
      • 1970-01-01
      • 1970-01-01
      • 2013-04-24
      • 2016-03-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-03-02
      相关资源
      最近更新 更多