NoClassDefFoundError,proGuard和补间引擎库

时间:2015-11-30 15:00:30

标签: java android opengl-es libgdx proguard

我将一个库作为.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

任何人都可以帮助我吗?

3 个答案:

答案 0 :(得分:2)

java.lang.NoClassDefFoundError是由jar文件在编译时出现但在运行时丢失引起的。您添加到项目中的罐子取决于还需要导入项目的其他罐子。

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

中找到后者

答案 1 :(得分:0)

是不是这样,你的应用程序在调试版本中工作正常,而不是在发布版本中工作(coz proguard仅在发布版本中出现)?

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

如果否,则添加库时会出现问题。在Eclipse中,右键单击.jar文件并转到选项&#39; Add to Build Path&#39;。在Android Studio中,检查以下代码存在的build.gradle。

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

答案 2 :(得分:0)

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

-keep class (...).flappy_dragon { *; }
-keep interface (...).flappy_dragon { *; }

你能试试吗?

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