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
到别的东西。 无论如何这不是真正的类名。 我的错…!
我有同样的问题,我做了以下来解决这个问题。
- 转到项目的“属性”。
- select“Java Build Path”
- select“订单和导出”选项卡
- 您应该在这里看到所选项目的“src”和“gen”path和依赖关系。
- 他们列出的顺序是第一个“src”,然后是“gen”path
- 我切换它们,以便在“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:
- 列表项目
- 检查出口订单
- 启用Multi Dex
- 检查布局中的api级别的视图。 我面临与searchView相同的问题。 我添加searchview时检查api级别,但添加实现SearchView.OnQueryTextListener到类文件。
1)在清单文件中提及你的活动名称和行动,也是类别。 2)在你的活动中提到你的起始内容视图,并在活动中提到你的视图ID。