Android的外部库项目上的NoClassDefFoundError

我使用eclipse进行Google Android开发。

我创build了一个库项目( [x] Is Library Android [x] Is Library中的[x] Is Library ),其中包括一个外部jar文件(引用库)。 这个库项目在另一个项目中引用(实际的项目将使用库项目)。 这是通过在Android设置下添加项目来完成的。

源代码编译,但如果我想在设备上执行它,我得到了一个类库的项目中包含的jar文件中的类的NoClassDefFoundError。

编辑: jar文件ist被添加到导出的条目( [x] my.jarOrder and Export从库项目的Tab)

有一个干净的方式来得到这个工作?

Solutions Collecting From Web of "Android的外部库项目上的NoClassDefFoundError"

这在官方的API中已经有明确的说明:

一个库项目可以包含一个JAR库

您可以开发一个本身包含JAR库的库项目,但是您需要手动编辑从属应用程序项目的构buildpath,并将path添加到JAR文件

jar lib必须手动添加到依赖应用程序项目的构buildpath中,而不仅仅是库项目构buildpath本身。

从SDK r17更新:

ADT现在自动处理这个问题,请在这里查看ADT 17.0.0版本的新function:

添加了自动设置JAR依赖项的function。 / libs文件夹中的任何.jar文件都被添加到构buildconfiguration中(类似于Ant构build系统的工作方式)。 此外,库项目所需的.jar文件也会自动添加到依赖于这些库项目的项目中。 ( 更多信息 )

对于那些遵循这些步骤(甚至检查“Order and Export”中的项目)并且在API 17中仍然存在java.lang.ClassNotFoundException的人来说,最后一步是检查你的编译器是否与Java 1.7一起运行。 如果是1.7,那么你应该把它更改为1.6所有的项目。 之后,它会要求重build所有的项目,并成功地在我的手机上运行:)

要更改eclipse中的java编译版本,它位于:Project properties> Java Compiler> Compiler Compliance level:1.6

转到project properties -> build path-> libraies

如果你看到你的jar文件是这样的

 snmp4j.jar - e:\software\jars 

它可能是你的问题

在您的项目中添加libs文件夹,并将jar文件复制到该文件夹​​中。 右键单击jar文件并转到build path -> add to build path 。 那么你可以看到你的jar子

 snmp4j.jar - project_name/libs 

它为我工作。

我有两个项目使用相同的库:一个工作,另一个与java.lang.NoClassDefFoundError崩溃。 在没有别的帮助之后,我查看了project.properties根目录下的project.properties文件。 工作项目有android.library.reference行(下面最后一行),崩溃的一行没有:

 # Project target. target=android-17 android.library.reference.1=../my-library-project 

我手动添加了行,它开始工作! (是的,我没有尝试两个(项目)属性-java构buildpath – 项目(项目)属性 – java构buildpath – 订单和出口 – 没有帮助。

PS顺便说一句,“项目属性”也有“项目引用”选项卡。 不知道这是否会奏效。

当我升级到ADT17时,我的一个小问题是我的库没有正确导入。 原来这是因为我的图书馆被链接为从我的lib文件夹而不是libs依赖!

似乎图书馆从现在起必须在libs文件夹中

我有一个类似的问题,并没有解决这里的解决scheme。

简短的版本: JAR是在Java 1.7中编译的,不能被Dalvikfind。

我们构build了一个内部JAR,我们通过Maven与后端和移动客户端共享。 最终的问题是JAR是用Java 1.7编译的。 Android的dalvik只支持Java 1.5和1.6。 这就是为什么在Eclipse中一切正常,因为在这一点上它没有编译到达尔维克。

我们甚至在Maven编译器插件中指定了目标和源代码版本,以便使用Java 1.6进行编译。 这不起作用,因为只有JDK 1.7安装在生成机器上。 Maven页面底部的一个小提示给了我们提示: Note: Merely setting the target option does not guarantee that your code actually runs on a JRE with the specified version.

若要查看是否还有此问题,请将*.jar文件重命名为*.zip解压缩,然后在MANIFEST.MF文件中查找Build-Jdk:参数,以查看实际编译JAR的Java版本。

另外要注意的是库包名。

如果您使用的是ADT21,而且您碰巧拥有相同软件包名称的库,那么在编译过程中会出现错误,但仍然可以在Eclipse中编译和运行,为您提供缺less一些资源类的APK。 因此,当你运行应用程序崩溃。

如果你用ANT编译它,那么你可以看到编译错误,说两个或多个库使用相同的包名称。

要解决这个问题,请使用Android工具 – >重命名应用程序包来重命名您的库项目。 然后一切都会恢复正常。

我花了几乎整整一天的时间才弄清楚