Android Activity ClassNotFoundException – 尝试了一切
我刚刚重构了一个应用程序到一个框架库和一个应用程序,但现在当我尝试在模拟器中启动应用程序,我得到以下错误堆栈跟踪:
06-02 18:22:35.529: E/AndroidRuntime(586): FATAL EXCEPTION: main 06-02 18:22:35.529: E/AndroidRuntime(586): java.lang.RuntimeException: Unable to instantiate activity ComponentInfo{com.matthewrathbone.eastersays/com.matthewrathbone.eastersays.EasterSimonSaysActivity}: java.lang.ClassNotFoundException: com.matthewrathbone.eastersays.EasterSimonSaysActivity in loader dalvik.system.PathClassLoader[/data/app/com.matthewrathbone.eastersays-1.apk] 06-02 18:22:35.529: E/AndroidRuntime(586): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2585) 06-02 18:22:35.529: E/AndroidRuntime(586): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2679) 06-02 18:22:35.529: E/AndroidRuntime(586): at android.app.ActivityThread.access$2300(ActivityThread.java:125) 06-02 18:22:35.529: E/AndroidRuntime(586): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2033) 06-02 18:22:35.529: E/AndroidRuntime(586): at android.os.Handler.dispatchMessage(Handler.java:99) 06-02 18:22:35.529: E/AndroidRuntime(586): at android.os.Looper.loop(Looper.java:123) 06-02 18:22:35.529: E/AndroidRuntime(586): at android.app.ActivityThread.main(ActivityThread.java:4627) 06-02 18:22:35.529: E/AndroidRuntime(586): at java.lang.reflect.Method.invokeNative(Native Method) 06-02 18:22:35.529: E/AndroidRuntime(586): at java.lang.reflect.Method.invoke(Method.java:521) 06-02 18:22:35.529: E/AndroidRuntime(586): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868) 06-02 18:22:35.529: E/AndroidRuntime(586): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626) 06-02 18:22:35.529: E/AndroidRuntime(586): at dalvik.system.NativeStart.main(Native Method) 06-02 18:22:35.529: E/AndroidRuntime(586): Caused by: java.lang.ClassNotFoundException: com.matthewrathbone.eastersays.EasterSimonSaysActivity in loader dalvik.system.PathClassLoader[/data/app/com.matthewrathbone.eastersays-1.apk] 06-02 18:22:35.529: E/AndroidRuntime(586): at dalvik.system.PathClassLoader.findClass(PathClassLoader.java:243) 06-02 18:22:35.529: E/AndroidRuntime(586): at java.lang.ClassLoader.loadClass(ClassLoader.java:573) 06-02 18:22:35.529: E/AndroidRuntime(586): at java.lang.ClassLoader.loadClass(ClassLoader.java:532) 06-02 18:22:35.529: E/AndroidRuntime(586): at android.app.Instrumentation.newActivity(Instrumentation.java:1021) 06-02 18:22:35.529: E/AndroidRuntime(586): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2577) 06-02 18:22:35.529: E/AndroidRuntime(586): ... 11 more
通常这意味着清单文件在某种程度上是错误的,但我已经仔细检查了所有我能想到的东西。
这是我的活动课:
package com.matthewrathbone.eastersays; import android.os.Bundle; import com.rathboma.simonsays.Assets.Season; import com.rathboma.simonsays.SeasonPicker; import com.rathboma.simonsays.SimonSaysActivity; public class EasterSimonSaysActivity extends SimonSaysActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); } @Override protected void onDestroy() { // TODO Auto-generated method stub super.onDestroy(); } @Override public SeasonPicker getSeasonPicker() { return new SeasonPicker(){ @Override public Season getSeason() { // TODO Auto-generated method stub return Season.EASTER; } }; } }
正如您所看到的,它在清单中正确列出:
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.matthewrathbone.eastersays" android:versionCode="1" android:versionName="1.0" > <uses-sdk android:minSdkVersion="7" android:targetSdkVersion="15" /> <application android:icon="@drawable/ic_launcher" android:label="@string/app_name" > <activity android:name=".EasterSimonSaysActivity" android:label="@string/app_name" > <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> </application> </manifest>
我不知道如何解决这个问题,并希望得到任何帮助。 我已经扫描了许多类似的问题,而没有看到这种特殊的行为。
更多信息:
- 我已经检查了生成的APK里面的类,并在classes.dex文件中有一个条目
- 我已经尝试在eclipse中清理/构建项目
- 我已经尝试使用一个全新的设备图像,它已经没有APK的副本
- 我已经把库项目改成了一个普通的java,然后改回到一个android项目,没有什么区别
- 将抽象SimonSaysActivity添加到清单中没有任何区别。
- 我已经尝试使每个依赖一个android库项目,并同步他们需要的android版本,它没有帮助
找到解决方案(见下文)。 给每个发表了答复/评论的人:你们都摇滚,感谢帮助我解决问题!
看起来这是由SDK工具升级引入的。 感谢下面这个链接的评论@Nick: http ://iqadd.com/item/noclassdeffounderror-adt-fix
我花了一些时间玩我自己的项目,我能够复制你的问题,并得到完全相同的异常堆栈跟踪时,试图运行我的主要项目,所以我认为这可能是原因:
就像我想的那样,这完全是关于如何在Android主项目中引用您的Android库项目,简单的Eclipse配置设置。
错误的方法:
右键单击主项目,选择Properties -> Java Build Path -> Projects -> Add...
,这个在Android主项目的构建路径中添加Android库项目作为依赖项目,这是行不通的。 如果在主项目中定义了所有必需的与Android相关的资源,在编译时就不会出现任何错误,但是在运行应用程序时,会得到问题中所述的异常。
正确的方法:
右键单击主项目,在库部分选择Properties -> Android
,在这里添加你的Android库项目。 查看官方开发指南引用一个库项目 。 这应该解决你所有的问题。 另外请注意,您必须使用相对路径引用实际Android库项目,如库项目 – 开发注意事项中所述 。
希望这可以帮助。
我已经测试了你给出的代码,而且工作正常。 尝试改变“扩展SimonSaysActivity”简单地“扩展活动”,并亲眼看到它的工作原理。
它不工作的原因是SimonSaysActivity不扩展活动(我不认为你犯了这个错误),或者构建路径的顺序是错误的。
要转到构建路径的顺序,请转到:
project->properties->Java build path->order and export .
我的基本命令是:项目src,项目gen,android 4.0.3,android依赖项。
当您使用库时,通常会发生此问题。
我刚刚重构了一个应用程序到一个框架库和一个应用程序。
我不完全确定你在这里想说什么,但是在这里你使用了“重构”这个词,这让我相信你误解了一个图书馆项目的概念。
什么库项目是 :
库项目是一个包含共享源代码和资源的开发项目。 其他Android项目可以引用库项目,并在编译时将其编译源包含在.apk文件中。
什么库项目不是 :
一个库项目不同于一个标准的Android项目,因为你不能直接将它编译成一个.apk
文件并在Android设备上运行它。 您不能将Android项目用作库项目,然后让另一个Android项目扩展库项目。 这种方式不行。
这就是说,我会调查你的图书馆项目的结构,并确保你已经正确地设置它 。 使用你的库来存储共享的代码/资源是可以的,但是如果你的库试图像在库项目本身中是一个单独的.apk
一样行事,那么你可能做错了什么。 如果遇到这种情况,我相信会抛出一个ClassNotFoundException
异常。 为了解决这个问题,我只是从头开始构建库项目,而不是试图将Android项目转换为库项目。 这会阻止你陷入微小的烦人的错误。
如果你仍然有麻烦,随意张贴更多的代码。 你还应该详细介绍一下你的图书馆项目的结构(和目的),你为什么决定使用它,你是如何创建的,等等。
对于Eclipse Kepler(Mac):按住Control键点按项目 – > Android工具 – >添加支持库
我遇到了这个问题,我正在做一个项目,虽然我的情况是不同的。 如果有人仍然无法找到解决方案,请尝试检查:
在Eclipse中:
Project properties -> Java Build Path -> Source tab
在里面你会发现一个包含所有源文件夹的列表,这些文件夹将被编译并放入生成的apk文件中,每次构建你的项目(和/ gen )。 Tipically:
>MyProject/gen >MyProject/src
你需要确定的是,在你的每个源文件夹里(排除/ gen ,所以这里只有/ src ), Output folder
项目Output folder
是默认的输出文件夹,它是MyProject/bin/classes
。 通过选择输出文件夹并单击从右边的一组按钮中删除(这将使其指向默认文件夹)。
如果您看不到子项目输出文件夹,请选中列表下方的“允许源文件夹输出文件夹”
Java中的classNotFoundException是java.lang.Exception的一个子类,当Java虚拟机尝试加载一个特定的类并且在classpath中没有找到所请求的类时就会发生。
阅读更多信息: http : //javarevisited.blogspot.com/2011/08/classnotfoundexception-in-java-example.html#ixzz3yX3WBeFA
尝试去Project -> Properties -> Java Build Path -> Order & Export
并确认Android专用库检查您的项目和您在应用程序中使用的所有其他库项目。
如何处理ClassNotFoundException
- 验证请求的类的名称是否正确,并在您的类路径中存在相应的.jar文件。 如果不是,则必须将其明确添加到应用程序的类路径中。
- 如果指定的.jar文件存在于您的类路径中,那么您的应用程序的类路径将被重写,您必须找到应用程序使用的确切类路径。
- 如果异常是由第三方类引起的,则必须标识抛出异常的类,然后在类路径中添加缺少的.jar文件。
虽然这不适用于所有人,但是我最近遇到了这个问题,因为我的项目无法与设备上的共享库链接。 我忘记了在我的清单中指定我的应用程序<uses-library>
。
从bin中删除classes.dex并重建项目
SimonSaysActivity使用/扩展哪些接口或父类,并且它们在您使用的Android版本上可用? 我看到类似的问题,我的活动实现了一个API接口,这是我使用的Android版本上不可用。
在我的情况下,我的活动实现了接口PopupMenu.OnDismissListener,它只在API 14中可用,但是当我在2.3设备上运行应用程序时,我收到了活动的java.lang.NoClassDefFoundError异常。
我有同样的问题,浪费了大部分时间尝试各种各样的事情。 应用程序从一台电脑上运行时发现,而不是在这台电脑上。 最后它最终成了一个缺少java的本质! 奇怪的是如何显示我的Java构建路径,订单/出口和所有,但没有一个Java的性质。 :(希望这节省了别人很多时间
如果你遵循所有的提示(检查私人图书馆等),仍然有错误。 在应用程序标签中检查你的清单中这行代码
android:hasCode="false"
删除它,并开心。 (我终于):)
@ yorkw提供的解决方案是绝对正确的。 我有一个额外的问题,在一个布局文件中,我提到了错误的绝对名称。 应该是这样的
<android.support.v4.view.ViewPager xmlns:android="...
而是我已经把它
<android.support.v4.app.view.ViewPager xmlns:android="...
解决这些后,它运作良好。
相信与否,对我来说,解决方法是从我的项目中删除谷歌分析库的旧版本(2.0),尝试了至少4个小时后。 当然,这个库的更新也可能是解决方案。 所以它可能是一个依赖jar的版本问题。
我遇到了同样的问题。 但后来我检查了应用程序的当前结构。我发现旧的应用程序结构(我不知道它是由android框架开发人员更改的时间)有一个文件夹名称"lib"
,现在是"libs"
。 我将我的所有jar文件迁移到“libs”,错误消失了。 我希望这可能有助于某人:)
试着让你的清单像这样。
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="zvjezdan.veselinovic.yahtzee_" android:versionCode="1" android:versionName="1.0" > <uses-sdk android:minSdkVersion="10" /> <application android:icon="@drawable/ic_launcher" android:label="@string/app_name" > <activity android:name=".YahtzeeActivity" android:label="@string/app_name" > <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> <activity android:name = ".Scoring_Page" /> </application> </manifest>
这背后的原因是:
public class EasterSimonSaysActivity extends SimonSaysActivity {
使用另一个活动。 所以如果你有两个活动,那么你需要添加他们两个。 当然,你输入了他们,但你的清单也需要知道这一点。 这是我为我的yahtzee项目“切换页面”的方式。 我仍然需要帮助。 = /