NoClassDefFoundError用于Android上的Java库中的代码


76

我的用户经常遇到错误。该应用程序在启动过程中崩溃。当应该加载MainActivity时,VM显然找不到该类。我不知道为什么。该应用程序的体系结构是有一个通用项目,我的免费版和专业版都在使用。不知道是否相关。请参阅下面的堆栈跟踪。有什么想法吗?

java.lang.NoClassDefFoundError: com.android.common.MainActivity
at com.mycompany.myapp.Splash.onCreate(Splash.java:23)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1615)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1667)
at android.app.ActivityThread.access$1500(ActivityThread.java:117)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:935)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:130)
at android.app.ActivityThread.main(ActivityThread.java:3687)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:507)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:842)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:600)
at dalvik.system.NativeStart.main(Native Method)
Caused by: java.lang.ClassNotFoundException: com.android.common.MainActivity in loader     dalvik.system.PathClassLoader[/system/framework/com.google.android.maps.jar:/data/app/com.android.pro-1.apk]

编辑: 感谢您在下面的评论,理查德。现在我换com.android.Splash了别的东西。无论如何,它不是真正的类名。我的错...!


3
为什么你曾经尝试创建一个已经存在的包中的类?(com.android.*)。那是不好的形式,请尝试更改包装。
理查德·罗斯三世

2
这只会在某些时候发生吗?还是在本地构建时总是发生?
David T.

2
仅在启动Play的应用中发生过。我自己还没看过,所以我刚刚看过在Crittercism上检索到的堆栈跟踪。
kjoelbro

Answers:


125

我遇到了同样的问题,我做了以下工作来解决该问题。

  1. 转到项目的“属性”。
  2. 选择“ Java构建路径”
  3. 选择“订购和出口”标签
  4. 您应该在此处看到所选项目的“ src”和“ gen”路径以及相关性。
  5. 他们列出的顺序首先是“ src”,然后是“ gen”路径
  6. 我切换它们,以便在“ src”之前构建“ gen”文件夹

gen-项目中的自动化代码(来自依赖项和引用)
src-项目中的源代码

无需重新启动Eclipse。它刚刚开始工作。

老实说,我从未尝试过“ Android工具>修复项目属性”,有时它可能正在做同样的事情。我不知道,我只是在看到错误消息后才在上面做过,认为构建路径有问题。


编辑


后来还不够,我又遇到了错误。然后,我“检查”了该视图中列出的所有依赖项。现在它又可以工作了。到现在为止还挺好。如果再次失败,我将保持更新。

仅供参考:在上一次尝试中,我尝试了“ Android工具>修复项目属性”,但是对我来说不起作用。


4
您编辑的ans也为我工作...由于ClassDefNotFoundError,我的头发拉了2-3小时
Prativa 2013年

1
我要发表评论,某人可能会找到一天。我的问题是从库项目中引用了不应使用的类。我在“库”选项卡中找到了错误/解决方案。我不知道它是否会帮助任何人,但是现在它可以在互联网上使用。
Andreas Rudolph

您建议将“ gen”与“ src”切换为有效,其他所有操作均失败!谢谢!
蒙奇斯2014年

该解决方案对我不起作用。但是,将包含的JAR文件移到顶部确实可以。这是给AFreeChart的。通常,更改构建顺序是此答案的一部分,可以解决此问题。NoClassDefFoundError是一个难以跟踪的问题。顺便说一句:我经常删除gen来进行重建。在这种情况下,gen将移至最底端。对我而言,这从来都不是问题。
肯尼斯·埃文斯

这是另一个为我工作的成功尝试.....以下提到了6个步骤,然后在“订购和出口”标签中取消了我自己的库(杰克逊等)
Shailendra Singh Rajawat 2014年

18

我当前使用的是SDK 20.0.3,以前的解决方案都不适用于我。

我能够使事情顺利进行

  • 右键单击Android项目
  • 然后选择构建路径->链接源以弹出“链接源”对话框。
  • 然后,我指定了Java项目的“ src”文件夹,并为其指定了不同于默认值“ src”的名称(例如“ src2”)。
  • 现在,您可以右键单击->删除新的“ src2”文件夹。

这带来了创建的Java类文件,这些文件是在构建Android项目时为Dalvik VM而不是Java VM编译的。这样,当创建Android项目.apk时,Android库jar文件中的Java类文件就可以通过脱色处理。现在,当应用程序运行时,找到了Java项目类,而不是抛出Java.lang.NoClassDefFoundError。

如果要使用jar文件而不是链接源,则需要创建一个Library Android项目。(在“属性”->“ Android”中选中了带有“是库”的Android项目。)然后,您需要如上所述将Java项目的源链接到Android库项目,或从将Java项目添加到Android库项目的“ src”文件夹中。生成Android库项目。然后,您将能够将创建的Android Project jar文件复制到Android文件夹的'libs'文件夹中,因为其中的类文件是在构建Android项目时为Davlik VM而不是Java VM编译的。这样,当创建Android项目.apk时,Android库jar文件中的Java类文件就可以通过脱粒处理。


17

尝试转到Project-> Properties-> Java Build Path-> Order&Export,并确保为您的项目以及您正在使用的所有其他库项目检查了Android Private Libraries。我通过以下链接NoClassDefFoundError Android Project获得了解决方案?


8

万一它对某人有所帮助,我也会遇到同样的问题。我的jar文件位于libs目录下,并且该jar已添加到构建路径。仍然抛出该异常。

我刚刚清理了项目,它对我有用。

Eclipse->项目->清理->选择项目并清理


7

我尝试了上述所有解决方案,但没有为我解决,这是我为完成此任务所做的工作:项目->配置构建路径->订单和导出->移动依赖项目


6

当您制作使用Google API(例如Google Maps)但在针对Android API的设备上运行该应用程序时,也会生成此错误。


1
这终于解决了我的问题。修复项目属性功能以某种方式不会更改目标。我通过更新我的Google API来解决此问题
博拉斯,2013年

5

我在使用java.nio.charset.StandardCharsets时遇到了NoClassDefFoundError。

原因是直到JRE 1.7才存在StandardCharsets。如果我将Java编译版本设置为1.7,则Eclipse会抱怨“ Android要求编译器符合级别5.0或6.0”。因此,我通过右键单击项目名称-> Android工具->修复项目属性来修复它。它是用JRE1.6编译的。

但是,因为StandardCharsets直到1.7才存在。当我运行它时报告了NoClassDefFoundError。

在尝试许多其他方法(包括重新安装JDK)之后,我才意识到这一点。NoClassDefFoundError的含义清楚地说明了真正的原因:尽管类通过了编译,但在运行时无法找到该类。

总体结论是,只要Android不能与JRE 1.7一起使用,如果您使用1.7以后提供的任何新功能,就会遇到此错误。

我的解决方案是将这些源代码复制到我的代码中!


1
+1我尝试使用Java 1.7编译的.jar文件。用Java 1.6重新编译jar后,它运行良好。
西蒙·福斯伯格

4

NoClassDefFoundError描述来自SO标签:

如果Java虚拟机或ClassLoader实例尝试加载类的定义(作为常规方法调用的一部分或使用新表达式创建新实例的一部分),则抛出Java错误,并且该类的定义无法被发现。当前编译的类在编译时就存在搜索到的类定义,但不再可以找到该定义。

或更好:

当Java虚拟机无法在运行时找到在编译时可用的特定类时,Java中就会出现NoClassDefFoundError。

这个页面。检查它,有一些方法可以解决该错误。希望对您有所帮助。


谢谢阿尔贝托!您的帖子帮助我了解了问题。现在,我对Android如何处理类路径感到好奇。:当前正在阅读这个问题stackoverflow.com/questions/1095322/...
kjoelbro

@Kjoendo不客气。我将阅读有关该问题的链接。:)
Alberto Solano

我刚吃完了ConcurrentSkipListMap; 我认为这是因为我的应用程序是在Froyo设备上运行的,并且Froyo中没有该类;但是,AdMob要求我定位“冰淇淋三明治”,因此我没有注意到这一点!
安德鲁·怀尔德

4

就我而言,我试图将使用jre 1.7编译的普通java类(来自普通java项目)添加到使用jre 1.7编译的android应用程序项目中。

解决方案是使用jre 1.6重新编译该普通Java类,并照常添加对android应用项目(也与jre 1.6一起编译)的引用(按Tab键顺序并导出,请务必检查该类,项目等)。

使用android库引用外部常规Java类时,执行相同的过程。

当从普通的Java项目中编译普通的Java类并尝试在android应用程序或android库项目中引用它们时,不知道jre 1.7怎么了。

如果您不使用普通的Java类(来自普通的Java项目),则无需降级到jre 1.6。


3

对我来说,这个问题与我未使用的API有关。例如,我使用aZSDK_API.jar作为参考。

要解决此问题,我必须右键单击该项目,然后选择属性。从JAVA BUILD PATH,我必须添加未部署的API。这很奇怪,因为应用程序抛出了找不到的MainActivity类,实际上,错误是由找不到的DiscoveryHandler类引起的。

希望这对某人有帮助。


2

我遇到了项目中存在的类(不是库类)的NoClassDefFoundError。该类存在,但我收到了NoClassDefFoundError。在我的情况下,问题是对multidex的支持。问题和解决方案在这里: Android Multidex和支持库

对于低于5.0的Android版本,您会收到此错误。


2

Android Studio上:

1)添加multiDexEnabled = true您的默认配置

2)在您的依赖项中添加编译com.android.support:multidex:1.0.0

3) Application class扩展MultiDexApplication而不是仅仅Application


1

其他想法。例如,您有一个派生自“ android.support.v4.app.Fragment”的类。

但是,您犯了一个错误,并从“ android.app.Fragment”继承了它。然后,您将在Android 2设备上出现此错误。


1

我刚刚发现一些与此错误。

只需确保库jar文件包含android.support.v7.appcompat包下的已编译R类,然后将v7 appcompat支持“项目”中的所有res复制到ANDROID_SDK_HOME / extras / android / support / v7 / appcompat文件夹中即可。

我将Netbeans与Android插件一起使用,这解决了我的问题。


1

我猜您javac在创建公共库时未指定的目标,因此javac自动使用最新的可用目标,该目标可能是1.7(Java7)或1.8(Java8)。

已经说过

Android要求编译器符合级别5.0或6.0

dx 低于19.0.0的Android构建工具无法将Java7(或更高版本)字节码转换为Dalvik字节码。

因此,可以使用版本大于等于19.0.0的构建工具,或者javac-target 6一起使用,例如通过修改您的ant来实现build.xml

<javac
srcdir="src/"
destdir="build/"
target="6"
/>

0

我通过在project.propertied中手动添加库项目路径来解决此问题。eclipse如何没有自动将此项与“ add project”一起自动添加。因此,应用程序试图引用lib项目中的任何componenrt时,它崩溃了。

您也可以尝试相同的事情。projec.properties中的应用依赖

android.library.reference.1 = .... \ android-sdks \ extras \ google \ google_play_services \ libproject / google-play-services_lib

然后跑。


0

jars曾经在lib /文件夹中,现在它们在libs /中。如果您使用lib,则可以将jars从lib移到libs,并从项目属性/ java构建路径中删除依赖项,因为Android现在会自动找到它们。


0

对我来说,问题在于所引用的库是使用Java 7构建的。我通过使用1.6 JDK进行重建来解决了这一问题。




0

活动再次添加到清单中。我尝试了清单,然后应用正常运行。

 <activity
        android:name="com.xxx.xxx.MainActivity"

0

尝试去

  • 右键项目
  • Java构建路径
  • 资源
  • 右侧->添加文件夹按钮
  • 选择libs文件夹并确定

希望对您有所帮助。


0

解决方案:

  1. 项目清单
  2. 检查出口订单
  3. 启用多敏捷
  4. 检查布局中视图的api级别。我在searchView上遇到了同样的问题。我在添加searchview时具有检查api级别,但向类文件添加了实现SearchView.OnQueryTextListener的功能。

-4

1)在清单文件中提及您的活动名称和活动,以及类别。2)在“活动”中提及您的初始contentview,并在活动中提及您的视图ID。


有人错误地将此标记为不是答案。这是对答案的尝试,因此有资格作为答案。如果您不喜欢该答案,则正确的操作是将其否决(因为其他5个人已经拥有),而不是对其进行举报。见你的答案是在另一座城堡-当一个答案是不是一个答案:meta.stackexchange.com/questions/225370/...
ArtOfWarfare
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.