向Eclipse Android项目添加库/ JAR

131
这是一个关于在Eclipse中添加第三方库(JAR)到Android项目的问题,分为两部分。
第一部分问题是,当我尝试添加第三方JAR(库)到我的Android项目时,我首先遇到了问题:

解析XML错误:未绑定前缀

因为我正在尝试使用来自该JAR的类(需要某种方式定义前缀)。这是怎么回事?
第二部分问题是,在修复了第一个问题之后,我的应用程序在Android上无法正常工作,并且通过调试器(LogCat)发现我尝试使用的类不存在。

Caused by: java.lang.ClassNotFoundException: com.github.droidfu.widgets.WebImageView...

为什么在Eclipse中没有编译或链接错误,但在模拟器上却出现这个问题?
这两个问题都是修辞性问题,因为我将在下面自己回答它们。论坛中的其他帖子也接近该问题,而我感觉自己可以更明确地为即将到来的人提供帮助。
8个回答

316

现在来讲一下缺失类的问题。

我是一名Eclipse Java EE开发人员,多年来习惯于通过Build Path中的“用户库”机制添加第三方库。当然,至少有3种方法可以添加第三方库,我使用的是最优雅的一种,在我看来。

然而,这对于Android不起作用,其Dalvik“JVM”无法处理普通的Java编译类,但必须将其转换为特殊格式。当你以我惯常的方式添加库时,这种转换不会发生。

相反,按照(广泛可得的)导入第三方库的说明,然后使用Build Path(使其为Eclipse编译目的所知)进行添加。以下是步骤:

  1. 将库下载到您的主机开发系统。
  2. 在Eclipse/Android项目中创建一个名为libs的新文件夹。
  3. 右键单击libs并选择导入 -> 常规 -> 文件系统,然后点击下一步,在文件系统中浏览以查找库的父目录(即:您下载的位置)。
  4. 单击确定,然后在左侧窗格中点击目录名称(而不是复选框),然后在右侧窗格中检查相关的JAR。这将把库放入您的项目中(物理上)。
  5. 右键单击您的项目,选择Build Path -> Configure Build Path,然后单击库选项卡,然后添加JARs...,转到libs目录中的新JAR并添加它。(顺便说一下,这是将您的新JAR转换为在Android上使用的时刻。)

注意:

如果库已经包含在您的构建路径中,则可能不需要步骤5。只需确保它存在于您的项目中再添加即可。

您在这里所做的事情实现了两件事:

  1. 在Android项目中包含Dalvik转换的JAR。
  2. 使Java定义可用于Eclipse,以便在开发(即编译)项目源代码时找到第三方类。

3
所以,我稍微改写了问题的部分内容。我抵制了做容易的事情(你在这里建议的那样)因为我真的认为两个问题都是尝试添加第三方库引起的,并且我打赌任何遇到第二个问题的人可能也曾经遇到过第一个问题。谢谢。 - Russ Bateman
2
嗨@RussBateman,我尝试了您上面提到的步骤,并成功地将库jar包包含在我的Android项目中,因此在编译时库类是可访问的。但是当我运行项目时,我的控制台会报错:"转换为Dalvik格式失败,错误代码为1",所以我的项目无法启动! - Zeba
在某些情况下,这不起作用...我不记得我做了什么,删除了libs文件夹,重新添加它...现在我做了你说的一切,添加了libs,导入了jar,添加到构建路径...编译器错误已经消失,但仍然会出现运行时异常,指出找不到该类 :( - User
我自己也遇到过这个问题,虽然不是在Android开发中。如果你正在进行OSGi/插件开发,那么在完成上述步骤之后,你需要执行一个额外的步骤。进入你的Manifest.MF > Runtime > Classpath。将你已经添加到构建路径中的每个jar文件都添加进去。别忘了添加你的src/文件夹以及其他为你的插件所需的内容。 - Martin
不幸的是,将jar文件添加到libs/后,ant构建将不再起作用:“com.android.dx.util.DexException:Multiple dex files define Lmain/java/org/random/class/Dates;”。ant“project.properties”引用库路径。对于特定的库,Eclipse无法导入它,因为由于某种原因源包不匹配源路径,所以Eclipse拒绝编译。 - Chloe
显示剩余2条评论

20

确保你的第三方 jar 包位于项目的 "libs" 文件夹中,当你打包应用时,它们将被放在 .apk 中。如果 jar 包中的某些内容不受支持,你可能会在设备上看到运行时错误,但除此之外,我在这方面取得了巨大的成功。


1
这完全是关于经验的问题,我以前遇到过相同的问题 :) - Paul Gregoire
谢谢您,但很让人沮丧的是 libs 文件夹需要复制我们已经在 Maven 仓库或其他地方拥有的外部 Jar 文件。 - asgs
1
很遗憾,这不再自动工作,您还需要告诉Eclipse将库包含在包文件中。 - Neil Townsend
那是什么时候改变的?这对我们所有人来说都是一个巨大的变化。 - Paul Gregoire

5

创建一个库项目

一个库项目是一个标准的Android项目,因此您可以像创建新应用程序项目一样创建它。

在创建库项目时,您可以选择任何应用程序名称、包和设置其他字段,如图1所示。

接下来,设置项目属性以指示它是一个库项目:

在“Package Explorer”中,右键单击库项目,然后选择“属性”。 在“属性”窗口中,选择左侧的“Android”属性组,并在右侧找到库属性。 选中“is Library”复选框,然后单击“应用”。 单击“确定”关闭“属性”窗口。 现在,新项目已标记为库项目。您可以开始将源代码和资源移动到其中,如下面的部分所述。


4
如果您正在使用ADT版本22,您需要在项目构建路径的Order&Export选项卡中检查android依赖项和android私有库。

2

首先,缺少前缀的问题。

如果您在布局文件中使用来自第三方的内容,可能需要同时使用其前缀,例如在下面的XML结构中出现了" droidfu:":

<com.github.droidfu.widgets.WebImageView android:id="@+id/webimage"
          android:layout_width="75dip"
          android:layout_height="75dip"
          android:background="#CCC"
          droidfu:autoLoad="true"
          droidfu:imageUrl="http://www.android.com/images/opensourceprojec.gif"
          droidfu:progressDrawable="..."
          />

这个内容来自JAR文件,但是你还需要添加新的"xmlns:droidfu"。

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
      xmlns:droidfu="http://github.com/droidfu/schema"
      ...>

否则会出现未绑定前缀错误。对我来说,这是由于没有从第三方库的页面中复制和粘贴所有提供的示例而导致的失败。


1

解析 XML 错误:未绑定前缀

资源 '/playteddy/res' 不存在。

我遇到了上述两个错误,最终我解决了它。

右键单击您的项目 -> 属性 -> Java 构建路径 -> Google AdMob 广告 SDK(选择并将其置于顶部),然后运行即可解决问题。这解决了我的运行时错误。


0

将源代码放入工作区之外的文件夹中。 在项目浏览器中右键单击,选择“导入…”

将项目作为 Android 项目导入到您的工作区中。 尝试构建并确保将其标记为库项目。 还要确保它使用了 Google API 支持进行构建,否则将会出现编译错误。

然后,在项目浏览器中右键单击您的主项目。 选择属性,然后选择左侧的 Android。 在下面的库部分,点击“添加”。

现在,mapview-balloons 库应该可以添加到您的项目中了。


0

在Eclipse中前往构建路径,然后点击“顺序和导出”,接着勾选库/ jar文件,再点击上移按钮将其移到列表顶部,以便首先编译它。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接