我刚刚将应用程序重构为框架库和应用程序,但现在当我尝试在模拟器中启动应用程序时,我得到以下错误堆栈跟踪:
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上扫描了很多类似的问题而没有看到这种特殊的行为。
更多信息:
找到解决方案(见下文)。对于发表回答/评论的每个人:你们都摇滚,谢谢你帮助我解决问题!
看起来这是SDK工具升级引入的。感谢@Nick在此链接的评论中: http://iqadd.com/item/noclassdeffounderror-adt-fix
答案 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
答案 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)
<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”中,错误消失了。
我希望这对某人有帮助:))