【问题标题】:java.lang.NoClassDefFoundError with all R classess when using android library使用android库时所有R类的java.lang.NoClassDefFoundError
【发布时间】:2013-07-17 22:50:41
【问题描述】:
我从 android 库下载了一个源代码,编译它并得到一个 .jar 文件,我将其包含到我的项目中并尝试使用它,但我总是得到一个 java.lang.NoClassDefFoundError,我注意到在jar 文件没有 R$XXX 文件,我读了这篇文章:Android Library Import delete R 并尝试了解决方案,但没有一个对我有用。
我制作了自己的简单库,我看到 R 文件也不包含在 jar 中,我必须使用 winrar 手动添加 .class 文件,但我想我缺少一些简单的东西,我正在使用 eclipse ADT。
谢谢大家
【问题讨论】:
标签:
android
noclassdeffounderror
【解决方案1】:
如果你正在创建 jar 文件,那么你不应该在 jar 文件中包含 r.java,manifeast 文件。
因为 jar 在编译期间不会被编译,并且不会在编译期间创建任何静态整数。
在android中我们有Android LIbrary,它类似于android项目,但可以包含在其他项目中。
如果您仍然需要 jar 文件,那么只需将类文件保存在 jar 中,包括应用程序中包含的所有资源,并且从 java 文件中,您可以使用以下代码在运行时引用资源。
您必须在代码中使用 getResourseIdByName(getPackageName(), "drawable", "icon") 而不是 R.drawable.icon。
下面是 getResourceIdByName 的代码::
public int getResourseIdByName(String packageName, String className, String name) {
int id = 0;
try {
for (int i = 0; i < Class.forName(packageName + ".R").getClasses().length; i++) {
if(Class.forName(packageName + ".R").getClasses()[i].getName().split("\\$")[1].equals(className)) {
if(Class.forName(packageName + ".R").getClasses()[i] != null)
id = Class.forName(packageName + ".R").getClasses()[i].getField(name).getInt(Class.forName(packageName + ".R").getClasses()[i]);
break;
}
}
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (IllegalArgumentException e) {
e.printStackTrace();
} catch (SecurityException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (NoSuchFieldException e) {
e.printStackTrace();
}
return id;
}