2

我有一个 Android 库项目 (A),它被多个 Android 应用程序项目使用。放置在libs库项目文件夹中的库 jar 指的是该项目中的com.lib.R资源文件(例如图像)。

当应用程序项目(B)使用这个库时,它可能会调用一些代码来触发 libs 文件夹中的 jar 文件来引用com.lib.R. 不幸的是,任何访问这些资源的尝试都会导致以下错误。

java.lang.NoClassDefFoundError: com.lib.R$layout

src/如果从 的文件夹Lib A或 的src/文件夹访问这些资源Project B,它们会正确解析为一个int值并且可以使用,但我不希望这样做并将代码保留在libs文件夹中。

我的问题- 为什么会发生这种情况,我该如何解决?一种解决方法是使用 以编程方式获取资源 ID resource.getIdentifier(),但这很快就会变得很痛苦。有没有一种方法我仍然可以com.lib.R从下面的库 jar中使用,libs而无需使用辅助方法手动解决它?

这是一个可以帮助您的插图。

从图书馆获取资源

从图书馆获取资源

4

1 回答 1

2

以及如何改进它

我将假设您的目标是能够以源代码形式分发 A 和 B,而不是some_lib.jar(“这样做的原因是避免将 java 文件暴露给最终用户”)的内容。在这种情况下:

第 1 步:创建另一个库项目 (L),其中包含源代码some_lib.jar及其引用的所有资源(将这些资源从 A 移出并移入 L)

步骤 #2:按照我今天早些时候写的秘诀创建一个分发库项目 (LD)

第 3 步:让 A 依赖 LD,以获取资源以及 L 代码的已编译 JAR

步骤#4:当你分发源代码时,也要分发 LD

我希望通过为some_lib的代码创建一个正式的库项目,并在该库项目中声明它需要的资源,您将能够编译一个适用于 B 的 JAR。

现在,这比我尝试过的要复杂,所以这完全有可能导致与您正在经历的结果相同的结果。如果是这种情况,那么您就不走运了,至少在您切换到基于 Gradle 的构建系统之前,在这种情况下,L/LD 变成了一个 AAR 文件,并且希望能够正常工作。

于 2013-07-10T21:14:31.990 回答