Java 从库jar中引用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

我有一个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
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文件。我愿意接受你关于为什么这是不可靠的以及我如何改进它的想法。谢谢