Java 从库jar中引用android资源
我有一个Android库项目(A),它被几个Android应用程序项目使用。放置在库项目的Java 从库jar中引用android资源,java,android,android-library,Java,Android,Android Library,我有一个Android库项目(A),它被几个Android应用程序项目使用。放置在库项目的libs文件夹中的库jar引用此项目中的com.lib.R资源文件(比如图像) 当应用程序项目(B)使用这个库时,它可能会调用一些代码来触发libs文件夹中的jar文件,以引用com.lib.R引用的资源。不幸的是,任何访问这些资源的尝试都会导致以下错误 java.lang.NoClassDefFoundError: com.lib.R$layout 如果从liba的src/文件夹或Project B的s
libs
文件夹中的库jar引用此项目中的com.lib.R
资源文件(比如图像)
当应用程序项目(B)使用这个库时,它可能会调用一些代码来触发libs文件夹中的jar文件,以引用com.lib.R
引用的资源。不幸的是,任何访问这些资源的尝试都会导致以下错误
java.lang.NoClassDefFoundError: com.lib.R$layout
如果从liba
的src/
文件夹或Project B
的src/
文件夹访问这些资源,它们将正确解析为int
值并可以使用,但我不希望这样做,而是将代码保存在libs
文件夹中
我的问题-为什么会发生这种情况,我如何解决?解决方法之一是使用resource.getIdentifier()
以编程方式获取资源ID,但这可能会很快成为一个难题。有没有一种方法我仍然可以从libs
下的库jar中使用com.lib.R
,而不必使用helper方法手动解析
这里有一个例子来帮助你
从图书馆访问资源
以及我如何改进它
我将假设您的目标是能够以源代码形式分发A和B,而不是some_lib.jar
(“这样做的原因是为了避免向最终用户公开java文件”)。在这种情况下:
步骤1:创建另一个库项目(L),其中包含来自some_lib.jar
的源代码及其引用的所有资源(将这些资源从A移到L)
步骤2:创建分发库项目(LD),如下所示
步骤#3:使用dependen-LD,获取资源以及L代码的编译JAR
步骤#4:分发源时,也要分发LD
我希望通过为一些库的代码创建一个正式的库项目,并在库项目中声明它需要的资源,您将能够编译一个适用于B的JAR
现在,这比我试过的要复杂得多,所以这完全有可能会产生和你所经历的相同的结果。如果是这样的话,那么你就不走运了,至少在你切换到基于Gradle的构建系统之前是这样,在这种情况下,L/LD变成了AAR文件,并且有望工作。“放在库项目的libs文件夹中的库jar指的是该项目中的com.lib.R资源文件(比如图像)。”--它不应该编译,因为根据定义,这个JAR在编译时既不是com.lib
,也没有访问com.lib.R
。我不知道你是怎么弄到那个罐子的,我也不知道你为什么期望你所做的是可靠的。@commonware Good catch。我首先定义了资源,然后从另一个项目中引用它们,从而得到了jar。然后编译java文件并将其作为jar放入库的libs
文件夹中。这样做的原因是为了避免向最终用户公开java文件。我愿意接受你关于为什么这是不可靠的以及我如何改进它的想法。谢谢