84

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

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

4

15 回答 15

148

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

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

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

正确方法:
右键主项目,选择Properties -> Android,在Library部分,在这里添加你的Android库项目。查看官方开发指南Referenceing a library project。这应该可以解决您的所有问题。另请注意,您必须使用相对路径引用实际的 Android 库项目,如库项目 - 开发注意事项中所述。

希望这可以帮助。

于 2012-06-09T23:42:58.517 回答
8

我已经测试了您提供的代码,它工作正常。尝试将“扩展 SimonSaysActivity”更改为简单的“扩展 Activity”,并亲自查看它是否有效。

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

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

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

我的基本顺序是:项目 src、项目 gen、android 4.0.3、android 依赖项。

当您使用库时,通常会出现此问题。

于 2012-06-02T22:58:43.467 回答
2

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

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


什么图书馆项目

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

什么图书馆项目不是

库项目与标准 Android 项目的不同之处在于,您不能将其直接编译为单个.apk文件并在 Android 设备上运行。您不能将一个 Android 项目用作库项目,然后让另一个 Android 项目扩展该库项目。它不是那样工作的。


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

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

于 2012-06-09T18:44:25.933 回答
2

对于 Eclipse Kepler(Mac):Control-click 项目 -> Android 工具 -> 添加支持库

于 2013-10-18T23:27:12.550 回答
2

尽管我的情况不同,但我正在从事的一个项目遇到了这个问题。如果那里的任何人仍然找不到解决问题的方法,请尝试检查:

在 Eclipse 中:

Project properties -> Java Build Path -> Source tab

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

>MyProject/gen
>MyProject/src

您需要确定的是,在您的每个源文件夹中(不包括/gen ,因此在这种情况下只有/srcOutput folder )该项目指向默认输出文件夹,即MyProject/bin/classes. 通过选择输出文件夹并从右侧按钮组中单击删除来执行此操作(这将使其指向默认文件夹)。

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

于 2014-05-22T23:00:33.813 回答
1

如果您遵循所有提示(检查私人图书馆等)并且仍然有错误。在应用程序标签中检查您的清单中的这行代码

    android:hasCode="false" 

删除它并快乐。(我终于):)

于 2013-09-23T12:31:33.047 回答
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. 如果异常是由第三方类引起的,您必须确定引发异常的类,然后在您的类路径中添加丢失的.jar文件。
于 2015-04-16T12:35:01.333 回答
1

虽然这不适用于所有人,但我最近遇到了这个问题,因为我的项目无法与设备上存在的共享库链接。我忘记在我的清单中指定我的应用程序<uses-library>.

于 2016-02-25T14:21:52.377 回答
1

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

于 2017-01-26T07:06:53.743 回答
0

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

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

于 2012-06-02T23:02:59.733 回答
0

我遇到了同样的问题,并且浪费了一天的大部分时间尝试各种事情。该应用程序在从一台 pc 部署时运行 find ,但不在这台 pc 上。最后,它最终成为了一种缺失的 java 特性!奇怪的是它如何向我展示了 java 构建路径、订单/导出和所有这些,但还没有 java 特性。:(希望这可以节省其他人很多时间

于 2013-09-19T01:40:16.453 回答
0

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

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

而是我把它

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

解决这些后,效果很好。

于 2014-06-24T09:50:34.763 回答
0

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

于 2015-05-07T23:06:54.227 回答
0

I was getting these type of error and i have tried everything but didn't get the solution. then i figured out if you are using library as aar file then you have to add all dependencies of your aar library to your app gradle.build file. if someone didn't figure out solution then try this!

于 2020-07-14T11:03:28.100 回答
-1

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

于 2014-02-11T09:31:28.760 回答