如何在Android项目中使用外部JAR?


326

我创建了一个Android项目,并将一个外部JAR(hessian-4.0.1.jar)添加到我的项目中。然后,我将JAR添加到构建路径,并在Order and Export中将其选中。

似乎忽略了Order和Export,并且在运行时缺少外部JAR中的所有类。

使用Eclipse插件构建Android应用程序时,是否有技巧从外部JAR中正确包含所需的类?我不想使用ant或Maven。


1
正如您已经发现的:这是由hessian-4.0.1.jar中的依赖关系引起的。如果要在Android上使用Hessian,请使用Hessdroid(code.google.com/p/hessdroid)。不太活跃,但即使在Android 4.0上也可以正常工作。
Ice09 2012年

1
有关使用外部jar的常见问题,另请参见“ Android上Java库中代码的NoClassDefFoundError”简单的解决方案
流程

Answers:


443

对于Eclipse

将外部JAR添加到您的Android项目或任何Java项目的一种好方法是:

  1. libs在项目的根文件夹中创建一个名为的文件夹
  2. 将您的JAR文件复制到libs文件夹
  3. 现在,右键单击Jar文件,然后选择Build Path> Add to Build Path,这将在项目中创建一个名为“ Referenced Libraries”的文件夹。

    这样,您将项目转移到另一台计算机时,就不会丢失硬盘驱动器上正在引用的

对于Android Studio

  1. 如果您在项目浏览器中的Android视图中,则将其更改为项目视图,如下所示

图片遗失

  1. 右键单击要在其中添加外部库的模块,然后选择“ 新建”>“ Directroy”,并将其命名为“ libs
  2. 现在将blah_blah.jar复制到“ libs ”文件夹中
  3. 右键单击blah_blah.jar,然后选择“ 添加为库.. ”。这将作为编译文件('libs / blah_blah.jar')自动添加并输入到build.gradle中,并同步gradle。你完成了

请注意:如果您使用的是第三方库,则最好使用可传递依赖项,其中gradle脚本运行时Gradle脚本会自动下载JAR和依赖项JAR。

例如:编译“ com.google.android.gms:play-services-ads:9.4.0”

阅读有关Gradle依赖管理的更多信息


49
注意,使用Eclipse的最新/ ADT版本当外部罐子都被称为一个文件夹中libs(而不是lib
T辅助细胞

4
@THelper-谢谢!您是正确的,该文件夹必须命名为“ libs”而不是“ lib”。我正在为这个问题而努力。
卡米尔·塞维尼(CamilleSévigny)2012年

7
在最新版本的SDK中,不需要步骤3(将JAR手动添加到构建路径)。但是,如果您有一个IDE(例如在放入文件时打开Eclipse),则必须进行项目刷新(在Package Explorer中,单击F5和/或上下文菜单Refresh)。
乔恩·亚当斯

4
如何从命令行完成?我必须编辑哪个配置文件,以及如何编辑?
克里斯蒂安·斯潘切格

13
自2012年初以来,这种方法已经过时了。只需将JAR添加到中即可libs/。不要手动修改构建路径。
CommonsWare

127

是的,您可以使用它。方法如下:

  1. 您的项目->右键单击->导入->文件系统-> yourjar.jar
  2. 您的项目->右键单击->属性-> Java构建路径->库->添加Jar-> yourjar.jar

如果您遇到一些问题,此视频可能会很有用。


5
自2012年初以来,这种方法已经过时了。只需将JAR添加到libs /中即可。不要手动修改构建路径。
CommonsWare

我尝试了各种添加构建路径的方法。只有这样,我才能将一个项目迁移到另一台PC后修复Class not found异常
Mickey 2013年

FIRST解决方案已经过时,无法正常使用。
Yousha Aleayoub 2015年

5

我当前使用的是SDK 20.0.3,以前的解决方案都无法为我工作。

hessdroid在hess失败的地方工作的原因是因为两个jar文件包含为不同虚拟机编译的java。由Java编译器创建的字节代码不能保证在Dalvik虚拟机上运行。不保证由Android编译器创建的字节码可以在Java虚拟机上运行。

就我而言,我可以访问源代码,并能够使用我在这里描述的方法为其创建一个Android jar文件:https : //stackoverflow.com/a/13144382/545064


5

我知道OP通过参考Eclipse插件结束了他的问题,但是我到达这里的时候没有指定Eclipse。因此,适用于Android Studio:

  1. jar文件添加到libs目录(例如复制/粘贴)
  2. 右键单击jar文件,然后选择“添加为库...”
  3. 在下一个对话框中单击“确定”,或选择重新命名。

而已!


4

事实证明,我对堆栈跟踪的了解还不够好,问题不在于未包含外部JAR。

问题是Android平台缺少javax.naming。*和外部JAR也具有依赖关系的许多其他软件包。

在Android项目中,添加外部JAR文件以及在Eclipse中设置“顺序和导出”的工作符合预期。


3

转到当前项目

右键单击->属性-> Java构建路径->将Jar文件添加到库中->单击确定

然后将其添加到当前项目中的“参考库”文件中。


1

Android的Java API不支持javax.naming。*和许多其他javax。*东西。您需要将依赖项包含在单独的jar中。


1

如果使用Android Studio,请执行以下操作(我已复制并修改了@Vinayak Bs答案):

  1. 在“项目”侧视图中选择“项目”视图(而不是“包”或Android)
  2. 在项目的根文件夹中创建一个名为libs的文件夹
  3. 将您的JAR文件复制到libs文件夹
  4. 侧视图将更新,并且JAR文件将显示在您的项目中
  5. 现在,右键单击要导入的每个JAR文件,然后选择“添加为库...”,它将包含在您的项目中
  6. 之后,您需要做的就是在代码中引用新类,例如。 import javax.mail.*

1

在Android Studio中,如果使用gradle

将此添加到build.gradle

compile fileTree(dir: 'libs', include: ['*.jar'])

并将jar文件添加到libs文件夹


1

如果您正在使用gradle构建系统,请按照下列步骤操作:

  1. jar文件放入libs您的Android应用的相应文件夹中。通常你会在找到它Project> app> libs。如果libs缺少文件夹,请创建一个。

  2. 将此添加到您的build.gradle文件中app。(不是您Projectbuild.gradle

    dependencies {
        compile fileTree(dir: 'libs', include: '*.jar')
        // other dependencies
    }

    这将包括jar文件libs夹中所有可用的文件。

如果不想包含所有jar文件,则可以单独添加。

compile fileTree(dir: 'libs', include: 'file.jar')


0

在项目内创建一个文件夹(如lib),将jar复制到该文件夹。现在从右键单击项目来配置构建路径,在构建路径中选择

“添加罐子” 浏览到您创建的文件夹,然后选择罐子。


0

并非总是可以将.jar文件复制到Android项目的文件夹中。
特别是如果它是工作空间中另一个项目的输出,并且会不断更新。

为了解决这个问题,您必须将jar作为链接文件添加到您的项目中,而不是导入它(它将在本地复制)。

在用户界面中,选择:

项目->导入->文件系统-> yourjar.jar->(“选项”区域)高级->在工作区中创建链接。

链接保存在.project文件中:

<linkedResources>
    <link>
        <name>yourjar.jar</name>
        <type>1</type>
        <locationURI>PARENT-5-PROJECT_LOC/bin/android_ndk10d_armeabi-v7a/yourjar.jar</locationURI>
    </link>
</linkedResources>

PARENT-5-PROJECT_LOC 表示相对于项目文件,最多5个目录(../../../../../)。

然后将其添加到库中:
项目->属性-> Java构建路径->库->添加jar-> yourjar.jar

在同一窗口中,选择“ 订购和出口”标签,并标记您的罐子,以便将其添加到apk中。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.