5

我从android库下载了一个源代码,编译它并得到一个.jar文件,我包含在我的项目中并尝试使用它,但我总是得到一个java.lang.NoClassDefFoundError,我注意到在jar文件中没有 R$XXX 文件,我读了这篇文章:Android Library Import delete R并尝试了解决方案,但没有一个对我有用。

我制作了自己的简单库,并且看到 R 文件不包含在 jar 中,我必须使用 winrar 手动添加 .class 文件,但我想我缺少一些简单的东西,我正在使用带有 ADT 的 eclipse。

谢谢大家

4

1 回答 1

8

如果您正在创建 jar 文件,则不应在 jar 文件中包含 r.java,manifeast 文件。

因为 jar 在编译期间不会被编译,并且在编译期间不会创建任何静态整数。

在 android 中,我们有Android LIbrary,它类似于 android 项目,但可以包含在其他项目中。

如果仍然需要 jar 文件,那么只需将类文件保存在 jar 中,包括应用程序中包含的所有资源,并且从 java 文件中,您可以使用以下代码在运行时引用资源。

您必须在代码中使用 getResourcesIdByName(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;
    }
于 2012-04-25T02:10:42.393 回答