我有一个Android库项目(A),由几个Android应用程序项目使用。放置在库项目的libs
文件夹内的库jar引用此项目中的com.lib.R
资源文件(比如图像)。
当应用程序项目(B)使用此库时,它可能会调用一些触发libs文件夹中的jar文件的代码来引用com.lib.R
引用的资源。遗憾的是,任何访问这些资源的尝试都会导致以下错误。
java.lang.NoClassDefFoundError: com.lib.R$layout
如果从src/
的{{1}}文件夹或Lib A
的{{1}}文件夹访问这些资源,则他们会正确解析为src/
值,并且可以使用,但我不想这样做,并将代码保存在Project B
文件夹中。
我的问题 - 为什么会发生这种情况,如何解决?一个解决方法是使用int
以编程方式获取资源ID,但这可能会非常快。有没有办法我仍然可以使用libs
下的库jar中的resource.getIdentifier()
,而无需使用辅助方法手动解析它?
以下是帮助您解决问题的说明。
来自图书馆的资源访问
答案 0 :(得分:2)
以及如何改进它
我将假设您的目标是能够以源代码形式分发A和B,而不是some_lib.jar
的内容(“这样做的原因是为了避免暴露java文件结束用户“)。在那种情况下:
步骤1:创建另一个库项目(L),其中包含来自some_lib.jar
的源代码及其引用的所有资源(将这些资源移出A和L)
步骤2:在the recipe that I just wrote about earlier today
之后创建一个分发库项目(LD)步骤3:依赖LD,获取资源以及已编译的LAR代码
步骤#4:分发源时,也要分发LD
我希望通过为some_lib
代码创建一个正式的库项目,并通过在该库项目中声明所需的资源,您将能够编译一个适用于B的JAR。
现在,这比我尝试的要复杂得多,因此完全有可能会产生与您遇到的相同的结果。如果是这种情况,那么你运气不好,至少在你切换到基于Gradle的构建系统之前,在这种情况下L / LD成为AAR文件,并且希望能够正常工作。