【问题标题】:NoClassDefFoundError, proGuard and tween-engine libraryNoClassDefFoundError、proGuard 和补间引擎库
【发布时间】:2015-11-30 15:00:30
【问题描述】:

我将一个库作为 .jar 文件添加到项目中。

我在 proGuard 中添加了条目:

# TweenEnginesLibrary
-libraryjars ../core/libs/tween-engine-api.jar
-keep class aurelienribon.tweenengine.** { *; }
-dontwarn aurelienribon.tweenengine.**

-keep class (...).flappy_dragon.TweenAccessors
-keep class (...).flappy_dragon.TweenAccessors.SpriteAccessor

这是我的 SpriteAccessor 类:

package (...).flappy_dragon.TweenAccessors;
​
import com.badlogic.gdx.graphics.g2d.Sprite;
import aurelienribon.tweenengine.TweenAccessor;
​
public class SpriteAccessor implements TweenAccessor<Sprite> {
​
    public static final int ALPHA = 1;
​
    @Override
    public int getValues(Sprite target, int tweenType, float[] returnValues) {
        switch (tweenType) {
        case ALPHA:
            returnValues[0] = target.getColor().a;
            return 1;
        default:
            return 0;
        }
    }
​
    @Override
    public void setValues(Sprite target, int tweenType, float[] newValues) {
        switch (tweenType) {
        case ALPHA:
            target.setColor(1, 1, 1, newValues[0]);
            break;
        }
    }
}

我仍然收到错误

java.lang.NoClassDefFoundError: (...).flappy_dragon.TweenAccessors.SpriteAccessor

谁能帮帮我?

【问题讨论】:

    标签: java android opengl-es libgdx proguard


    【解决方案1】:

    java.lang.NoClassDefFoundError 是由编译时存在但在运行时丢失的 jar 文件引起的。您添加到项目中的 jar 依赖于也需要导入到您的项目中的其他 jar。

    您应该比较您的构建路径和运行时类路径。在 Eclipse 中,您可以在 Project -&gt; Properties -&gt; Java build Path 中找到前者,在 Run -&gt; Run Configurations... -&gt; Classpath 中找到后者

    【讨论】:

    • 我没有使用 Eclipse。我正在使用 android studio 和 proGuard。我认为我需要在我的 proGuard 文件中添加一些行。
    • 您使用的 IDE 没有区别。如果导出 jar,则必须确保包含所有依赖项。 (包含其他类所依赖的类的所有 jar)
    • NoClassDefFoundError 的主要原因正如 steven35 所说:存在于编译时,而不是运行时。但还有另一种可能发生的方式,那就是 SpriteAccessor depends 所依赖的类在编译时存在,但在运行时不存在。
    【解决方案2】:

    您的应用程序在调试版本中运行良好,而在发布版本中无法正常运行(因为 proguard 仅在发布版本中出现)?

    如果是,则在 Proguard 中提供设置时存在问题。

    如果否,则添加库有问题。在 Eclipse 中,右键单击 .jar 文件并选择“添加到构建路径”选项。在 Android Studio 中,检查 build.gradle 是否存在以下代码。

    dependencies { compile fileTree(dir: 'libs', include: ['*.jar']) }

    【讨论】:

      【解决方案3】:
      # TweenEnginesLibrary
      -libraryjars ../core/libs/tween-engine-api.jar
      -keep class aurelienribon.tweenengine.** { *; }
      -dontwarn aurelienribon.tweenengine.**
      
      -keep class (...).flappy_dragon { *; }
      -keep interface (...).flappy_dragon { *; }
      

      你可以试试这个吗?

      您还应该发布完整的错误日志。因为它可能对转换的类名说。所以我们可以更好地应用proguard。

      【讨论】:

        猜你喜欢
        • 2013-08-01
        • 2016-02-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-03-15
        • 1970-01-01
        • 2014-10-18
        • 1970-01-01
        相关资源
        最近更新 更多