Android Activity ClassNotFoundException - 尝试了一切

时间:2012-06-02 22:30:38

标签: java android android-fragments classnotfoundexception android-library

我刚刚将应用程序重构为框架库和应用程序,但现在当我尝试在模拟器中启动应用程序时,我得到以下错误堆栈跟踪:

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>

我不知道如何解决这个问题,并希望得到任何帮助。我已经在SO上扫描了很多类似的问题而没有看到这种特殊的行为。

更多信息:

  • 我已经检查了生成的APK,并且该类中有一个条目 classes.dex文件
  • 我试过清理/建设项目 eclipse
  • 我尝试使用一个没有的全新设备图像 已经有APK的副本
  • 我已将库项目更改为 一个普通的java,然后改回一个android项目,没有 差
  • 将抽象的SimonSaysActivity添加到清单中没有任何区别。
  • 我已经尝试将每个依赖项都设置为一个android库项目,并同步他们需要的android版本,它没有帮助

找到解决方案(见下文)。对于发表回答/评论的每个人:你们都摇滚,谢谢你帮助我解决问题!

看起来这是SDK工具升级引入的。感谢@Nick在此链接的评论中: http://iqadd.com/item/noclassdeffounderror-adt-fix

15 个答案:

答案 0 :(得分:147)

我花了一些时间玩我自己的项目,我能够复制你的问题,并在尝试运行我的主项目时得到完全相同的异常堆栈跟踪,所以我认为这可能是原因:

就像我想的那样,这就是你如何在Android主项目中引用你的Android库项目,这是一个简单的Eclipse配置设置。

错误的方式:
右键单击主项目,选择Properties -> Java Build Path -> Projects -> Add...,这将Android库项目添加为Android主项目构建路径中的依赖项目,这不起作用。如果在主项目中定义了所有必需的Android相关资源,则在编译时不会出现任何错误,但在运行应用程序时,您将获得问题中描述的异常。

正确的方式:
右键单击主项目,选择Properties -> Android,在“库”部分中,在此处添加Android库项目。查看官方开发指南Referencing a library project。这应该解决你所有的问题。另请注意,您必须使用相对路径引用实际的Android库项目,如Library Project - Development considerations中所述。

希望这有帮助。

答案 1 :(得分:8)

我测试了你给出的代码,它运行正常。 尝试将“extends SimonSaysActivity”更改为“扩展活动”,并亲眼看看它是否有效。

它不起作用的原因是SimonSaysActivity没有扩展Activity(我认为你没有犯这个错误),或者构建路径的顺序是错误的。

转到构建路径的顺序,转到:

project->properties->Java build path->order and export .

我的基本订单是:project src,project gen,android 4.0.3,android dependencies。

使用库时通常会发生此问题。

答案 2 :(得分:2)

  

我刚刚将应用程序重构为框架库和应用程序。

我不完全确定你在这里要说的是什么,但是你在这里使用“重构”这个词的事实让我相信你误解了图书馆项目的概念。


的库项目

库项目是一个包含共享源代码和资源的开发项目。其他Android项目可以引用库项目,并在编译时将其编译的源包含在.apk文件中。

哪些图书馆项目不是

库项目与标准Android项目的不同之处在于,您无法将其直接编译为单个.apk文件并在Android设备上运行。您不能将Android项目用作库项目,然后使用另一个Android项目扩展库项目。它没有那种方式。


那就是说,我会调查你的图书馆项目的结构,并确保你set it up correctly。使用您的库来存储共享代码/资源是可以的,但如果您的库试图表现得像在库项目本身中是一个单独的.apk,那么您可能做错了什么。如果是这种情况,我相信会抛出ClassNotFoundException。为了解决这个问题,我只是从头开始构建库项目,而不是尝试将Android项目转换为库项目。这样可以防止你遇到微小的,恼人的错误。

如果您仍然遇到问题,请随意发布更多代码。您还应该详细说明您的库项目的结构(和目的)...为什么您决定使用它,如何创建它等等。

答案 3 :(得分:2)

对于Eclipse Kepler(Mac):按住Control键单击项目 - &gt; Android工具 - &gt;添加支持库

答案 4 :(得分:2)

我遇到了一个我正在研究的项目的问题,尽管我的情况有所不同。 如果那里的任何人仍然找不到他们问题的解决方案,请尝试检查:

在Eclipse中:

Project properties -> Java Build Path -> Source tab

在里面你会找到一个列表,其中包含所有要编译的源文件夹,并在每次构建项目时放入生成的apk(以及 / gen )。 Tipically:

>MyProject/gen
>MyProject/src

您需要确定的是每个源文件夹中的内容(排除 / gen ,在这种情况下只有 / src )项目{ {1}}正在访问默认输出文件夹,即Output folder。通过选择“输出”文件夹并从右侧按钮组中单击“删除”(这将使其指向默认文件夹)来执行此操作。

如果您看不到子项输出文件夹,请在列表下方选中“允许源文件夹的输出文件夹”

答案 5 :(得分:1)

  Java中的classNotFoundException是java.lang.Exception的子类   当Java虚拟机尝试加载特定类时出现   并且没有在类路径中找到所请求的类。

了解详情:http://javarevisited.blogspot.com/2011/08/classnotfoundexception-in-java-example.html#ixzz3yX3WBeFA

尝试转到 Project -> Properties -> Java Build Path -> Order & Export 并检查确认Android私有库以查找您的项目以及您在应用程序中使用的所有其他库项目。

如何处理ClassNotFoundException

  1. 验证所请求的类的名称是否正确以及该名称 您的类路径中存在相应的.jar 文件。如果没有,你必须 将它显式添加到应用程序的类路径中。
  2. 如果您的类路径中存在指定的.jar文件,那么,您的 应用程序的类路径正在被覆盖,你必须找到 您的应用程序使用的确切类路径。
  3. 如果异常是由第三方类引起的,则必须 识别抛出异常的类,然后添加 classpath 中缺少 .jar 文件。

答案 6 :(得分:1)

虽然这不适用于所有人,但我最近遇到了这个问题,因为我的项目无法与设备上的共享库链接。我忘了specify in my manifest我的申请<uses-library>

答案 7 :(得分:1)

从bin中删除classes.dex并重建项目

答案 8 :(得分:0)

SimonSaysActivity使用/扩展了哪些接口或父类,并且它们是否适用于您正在使用的Android版本?我已经看到类似的问题,我的活动实现了一个API接口,这个接口在我使用的Android版本上不可用。

在我的情况下,我的活动实现了PopupMenu.OnDismissListener接口,该接口仅在API 14中可用,但是当我在2.3设备上运行应用程序时,我收到了活动的java.lang.NoClassDefFoundError异常。

答案 9 :(得分:0)

我遇到了同样的问题,大部分时间都在浪费各种各样的事情。应用程序在从一台PC上部署而不是在这台PC上运行时查找。最后它最终成为一个缺少java的本质!奇怪的是它如何向我展示了java构建路径,顺序/导出以及所有这些,但却没有java性质。 :(希望这能节省别人很多时间

答案 10 :(得分:0)

如果您遵循了所有提示(检查了私有库等)并仍然有错误。 在application-tag

中检查您的清单中的这行代码
    android:hasCode="false" 

删除它并开心。 (我终于):))

答案 11 :(得分:0)

@yorkw提供的解决方案绝对正确。我有一个额外的问题,在其中一个布局文件中,我已经错误地提到了绝对名称。应该是

<android.support.v4.view.ViewPager xmlns:android="...

而是我把它放了

<android.support.v4.app.view.ViewPager xmlns:android="...
解决这些问题之后,它运作良好。

答案 12 :(得分:0)

信不信由你,对我的修复是在尝试所有内容至少4小时后,从我的项目中删除旧版本(2.0)的谷歌分析库。当然,这个库的更新也可以是解决方案。 所以它可能是依赖jar版本问题。

答案 13 :(得分:0)

我遇到了这类错误,我已经尝试了所有方法,但没有得到解决方案。然后我想出了如果您使用库作为aar文件,那么您必须将aar库的所有依赖项添加到您的应用gradle.build文件中。如果有人不知道解决方案,那就试试吧!

答案 14 :(得分:-1)

我遇到了同样的问题。 但后来我检查了应用程序的当前结构。我发现旧的应用程序结构(我不知道它是由android框架开发人员更改的时间)有一个文件夹名"lib"现在是"libs" 。 我将所有jar文件迁移到“libs”中,错误消失了。 我希望这对某人有帮助:))