Android上的Java库中的代码的NoClassDefFoundError

我在用户中经常遇到错误。 该应用程序在启动过程中崩溃。 当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到别的东西。 无论如何这不是真正的类名。 我的错…!

我有同样的问题,我做了以下来解决这个问题。

  1. 转到项目的“属性”。
  2. select“Java Build Path”
  3. select“订单和导出”选项卡
  4. 您应该在这里看到所选项目的“src”和“gen”path和依赖关系。
  5. 他们列出的顺序是第一个“src”,然后是“gen”path
  6. 我切换它们,以便在“src”之前构build“gen”文件夹

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

没有必要重新启动Eclipse。 它刚刚开始工作。

老实说,我从来没有尝试过“Android工具>修复项目属性”,有时它可能会做同样的事情。 我不知道,在看到错误信息后,我刚刚做了上面的事情,认为构buildpath出了问题。


编辑


后来这是不够的,我再次得到错误。 然后我“检查”该视图中列出的所有依赖项。 现在它再次运作。 到现在为止还挺好。 如果再次失败,我会保持更新。

仅供参考 :在我的最后一次尝试中,我尝试了“Android工具>修复项目属性”,但它并没有为我工作。

我目前正在使用SDK 20.0.3,以前的解决scheme都没有为我工作。

我能够把事情做好

  • 右键单击Android项目
  • 然后selectBuild Path – > Link Source打开Link Source对话框。
  • 然后,我指定了Java项目的“src”文件夹,并给它一个除“src”(例如“src2”)以外的名称。
  • 您现在可以右键单击 – >删除新的“src2”文件夹。

这带来了这个创build的Java类文件,这些文件是在Android项目构build时为Dalvik VM而不是Java VM编译的。 当Android项目.apk被创build时,这允许Android库jar文件中的Java类文件通过dexing。 现在,当应用程序运行时,find了Java项目类,而不是抛出Java.lang.NoClassDefFoundError。

如果你想使用jar文件而不是链接源代码,那么你将需要创build一个Library Android项目。 (在Properties – > Android中选中'is library'的Android项目)。然后,您需要将Java Project的源代码链接到Android Library项目,或者将源文件从“src”文件夹复制到Java项目添加到Android库项目的“src”文件夹中。 构buildAndroid库项目。 然后,您将能够将创build的Android Project jar文件复制到Android文件夹的“libs”文件夹中,因为其中的类文件是在构buildAndroid项目时为Davlik VM而不是Java VM编译的。 当Android项目.apk被创build时,这允许Android库jar文件中的Java类文件通过dexing。 现在,当应用程序运行时,将会findJava项目类,而不是抛出Java.lang.NoClassDefFoundError。

尝试去项目 – >属性 – > Java构buildpath – >订单&导出,并确保Android专用库检查您的项目和所有其他库项目使用。 我通过下面的链接NoClassDefFoundError Android项目得到了解决scheme?

为了以防万一,我也面临同样的问题。 我的jar文件在libs目录下,jar被添加到构buildpath中。 仍然是抛出这个例外。

我刚刚清理了这个项目,并且为我工作。

Eclipse – > Project – > Clean – >select项目并清理

我尝试了上述的所有解决scheme,但没有为我工作,这是我做了什么,以完成项目 – >configuration构buildpath – >订单和出口 – >移动依赖项目上

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

当我使用java.nio.charset.StandardCharsets时,遇到了这个NoClassDefFoundError。

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

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

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

一般的结论是,只要Android不支持JRE 1.7,如果你使用1.7以后提供的任何新function,你将会遇到这个错误。

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

NoClassDefFoundError描述来自SO标签:

如果Java虚拟机或ClassLoader实例尝试加载类的定义(作为常规方法调用的一部分或者使用新expression式创build新实例的一部分),并且没有定义类,则抛出Java错误被发现。 search到的类定义存在于当前正在执行的类被编译时,但定义不能再被find。

或者更好:

Java中的NoClassDefFoundError出现在Java虚拟机无法在运行时find在编译期间可用的特定类。

从这个页面。 检查一下,有一些方法可以解决这个错误。 我希望它有帮助。

对于我来说,这个问题与我正在使用的API没有被部署。 例如,我使用了一个ZSDK_API.jar作为参考。

要解决这个问题,我不得不右键单击该项目并select属性。 从JAVA构buildpath,我不得不添加没有被部署的API。 这很奇怪,因为应用程序抛出MainActivity类没有find,实际上错误是由DiscoveryHandler类没有find。

希望这可以帮助别人。

在我的情况下,我试图添加一个正常的Java类(从一个普通的Java项目)编译与JRE 1.7到一个Android应用程序项目编译与JRE 1.7。

解决的办法是像平常一样重新编译普通的java类,使用jre 1.6并添加对android应用程序项目的引用(也可以使用jre 1.6编译)(按Tab键导出,确保检查类,项目等)。

同样的过程,当使用android库引用外部正常的java类。

不知道什么是错误的1.7,从一个正常的Java项目编译正常的Java类,并尝试在Android应用程序或Android库项目中引用它们。

如果你不使用普通的java类(从一个普通的java项目),你不需要降级到jre 1.6。

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

Android版本低于5.0时会出现此错误。

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

但是,你犯了一个错误,并从“android.app.Fragment”inheritance它。 那么你将在Android 2设备上出现这个错误。

我刚刚弄清楚了这个错误。

只要确保库jar文件包含android.support.v7.appcompat包下编译的R类,并复制你的ANDROID_SDK_HOME / extras / android / support / v7 / appcompat文件夹中的v7 appcompat支持“项目”中的所有res。

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

我猜测你在创build公共库时没有指定javac的目标,所以javac自动使用最新的可用目标,可能是1.7(Java7)或1.8(Java8)。

已经说过了

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

Android的构build工具的dx <19.0.0不能将Java7(或更高版本)的字节码转换为Dalvik字节码。

所以要么使用版本工具版本> = 19.0.0,要么使用javac-target 6 ,例如修改你的ant build.xml像这样:

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

我通过在project.propertied中手动添加库项目path来解决这个问题。 一些如何eclipse没有添加此项随着“添加项目”自动添加。 所以应用程序试图引用lib项目中的任何componenrt它崩溃的地步。

你也可以尝试同样的事情。 projec.properties中的应用依赖性

android.library.reference.1 = …. \ Android的软件开发工具包\演员\谷歌\ google_play_services \ libproject /谷歌播放services_lib

并运行。

jars曾经是在lib /文件夹,现在他们在libs /如果你使用lib,你可以将你的jar从lib移动到libs,并从项目属性/ java构buildpath中删除依赖项,因为Android现在可以自动find它们。

对我来说,问题是引用的库是使用java 7构build的。我通过使用1.6 JDK进行重build来解决此问题。

有些时候java.lang.NoClassDefFoundError:使用ART代替Dalvik运行时出现错误。 要更改运行时间,只需转到开发人员选项 – >select运行时间 – > Dalvik。

如果没有上述的工作(就像它发生在我身上),并且您在Eclipse中作为库使用另一个项目。

这样做:右键单击项目 – >属性 – > Android – >库 – >添加

那是为我做的! 将项目添加为库(项目属性)

活动再次添加到manifest.I尝试在我的清单,然后应用程序工作。

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

试试去

  • 右键单击项目
  • Java构buildpath
  • 资源
  • 右侧 – >添加文件夹button
  • 选定的libs文件夹并确定

我希望它有帮助。

Android Studio上:

1)默认的configuration中添加multiDexEnabled = true

2)在你的依赖关系中添加compile com.android.support:multidex:1.0.0

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

解决scheme:

  1. 列表项目
  2. 检查出口订单
  3. 启用Multi Dex
  4. 检查布局中的api级别的视图。 我面临与searchView相同的问题。 我添加searchview时检查api级别,但添加实现SearchView.OnQueryTextListener到类文件。

1)在清单文件中提及你的活动名称和行动,也是类别。 2)在你的活动中提到你的起始内容视图,并在活动中提到你的视图ID。