アプリをフレームワークライブラリとアプリケーションにリファクタリングしましたが、エミュレータでアプリを起動しようとすると、次のエラースタックトレースが表示されます。
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
私は自分のプロジェクトでしばらく時間を費やしましたが、メインプロジェクトを実行しようとすると、問題を再現し、まったく同じ例外スタックトレースを取得することができますので、これが原因だと思います:
私が考えていたのと同じように、シンプルなEclipse構成設定であるAndroidメインプロジェクトでAndroidライブラリプロジェクトを参照する方法がすべてです。
間違った方法:
メインプロジェクトを右クリックし、Properties -> Java Build Path -> Projects -> Add...
を選択します。これにより、AndroidライブラリプロジェクトがAndroidメインプロジェクトのビルドパスの依存関係プロジェクトとして追加されます。これは機能しません。必要なすべてのAndroid関連リソースがメインプロジェクトで定義されている場合、コンパイル時にエラーは発生しませんが、アプリケーションを実行すると、質問で説明されている例外が発生します。
正しい方法:
メインプロジェクトを右クリックして、Properties -> Android
を選択し、[ライブラリ]セクションでAndroidライブラリプロジェクトをここに追加します。公式開発者ガイドをご覧ください ライブラリプロジェクトの参照 。これですべての問題が解決するはずです。 ライブラリプロジェクト-開発の考慮事項 で説明されているように、実際のAndroidライブラリプロジェクトを参照する相対パスを使用する必要があることにも注意してください。
お役に立てれば。
私はあなたが与えたコードをテストしました、そしてそれはうまく働きます。 「SimonSaysActivityを拡張する」を単に「アクティビティを拡張する」に変更してみて、それが機能することを確認してください。
動作しない理由は、SimonSaysActivityがActivityを拡張していない(この間違いを犯したとは思わない)か、ビルドパスの順序が間違っているためです。
ビルドパスの順序に移動するには、次の場所に移動します。
project->properties->Java build path->order and export .
私の基本的な順序は次のとおりです。プロジェクトsrc、プロジェクトgen、Android 4.0.3、Android依存関係。
この問題は通常、ライブラリを使用するときに発生します。
アプリをフレームワークライブラリとアプリケーションにリファクタリングしました。
ここで何を言おうとしているのか完全にはわかりませんが、ここで「リファクタリングされた」という言葉を使ったという事実は、あなたが図書館プロジェクトの概念を誤解していると信じさせてくれます。
ライブラリプロジェクトは、共有ソースコードとリソースを含む開発プロジェクトです。他のAndroidプロジェクトは、ライブラリプロジェクトを参照し、コンパイル時に.apkファイルにコンパイル済みソースを含めることができます。
ライブラリプロジェクトは、単一の.apk
ファイルに直接コンパイルしてAndroidデバイスで実行できないという点で、標準のAndroidプロジェクトとは異なります。 Androidプロジェクトをライブラリプロジェクトとして使用してから、別のAndroidプロジェクトextendを使用することはできません。ライブラリプロジェクト。それはそのようには機能しません。
そうは言っても、ライブラリプロジェクトの構造を調査し、 正しくセットアップする であることを確認します。ライブラリを使用して共有コード/リソースを保存することは問題ありませんが、ライブラリがライブラリプロジェクト自体の中で別の.apk
であるかのように動作しようとしている場合、おそらく何か間違ったことをしているでしょう。この場合、ClassNotFoundException
がスローされると思います。この問題を解決するには、Androidプロジェクトをライブラリプロジェクトに変換するのではなく、ライブラリプロジェクトをゼロからビルドするだけです。これにより、小さな厄介なバグに遭遇することを防ぎます。
それでも問題が解決しない場合は、より多くのコードを投稿してください。また、ライブラリプロジェクトの構造(および目的)についてもう少し詳しく説明する必要があります。なぜそれを使用することにしたのか、どのように作成したのかなどです。
Eclipse Kepler(Mac)の場合:Controlキーを押しながらプロジェクトをクリック-> Androidツール->サポートライブラリを追加
私のケースは異なりましたが、私が取り組んでいたプロジェクトでこの問題が発生しました。それでも問題の解決策が見つからない場合は、これを確認してください。
Eclipseの場合:
Project properties -> Java Build Path -> Source tab
内部には、コンパイルされるすべてのソースフォルダーのリストがあり、プロジェクトをビルドするたびに生成されたapkに入れられます(そして / gen)。一般的に:
>MyProject/gen
>MyProject/src
確認する必要があるのは、各ソースフォルダー内です(除外 / gen、そうだけ / src この場合)アイテムOutput folder
はデフォルトの出力フォルダーMyProject/bin/classes
にポイティングしています。これを行うには、[出力フォルダー]を選択し、右側のボタンセットから[削除]をクリックします(これにより、既定のフォルダーを指すようになります)。
サブアイテムの出力フォルダーが表示されない場合は、リストのすぐ下にある[ソースフォルダーの出力フォルダーを許可する]をオンにします。
binsからclasses.dexを削除し、プロジェクトを再構築します
これはすべての人に当てはまるわけではありませんが、プロジェクトがデバイス上にある共有ライブラリとリンクできなかったため、最近この問題が発生しました。 マニフェストで指定 アプリケーション<uses-library>
を忘れていました。
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 Private Librariesはプロジェクトおよびアプリケーションで使用している他のすべてのライブラリプロジェクトをチェックします。
ClassNotFoundExceptionの対処方法
@yorkwが提供するソリューションは完全に正しいです。追加の問題がありました。レイアウトファイルの1つで、絶対名が間違って言及されていました。あるべきだった
<Android.support.v4.view.ViewPager xmlns:Android="...
むしろ私はそれを置いていた
<Android.support.v4.app.view.ViewPager xmlns:Android="...
これらを解決した後、うまくいきました。
信じられないかもしれませんが、私が修正したのは、すべてを4時間以上試した後、Googleアナリティクスライブラリの古いバージョン(2.0)をプロジェクトから削除することでした。もちろん、このライブラリの更新も解決策になる可能性があります。そのため、依存関係のjarバージョン管理の問題である可能性があります。
私は同じ問題を抱えていて、あらゆる種類のことをしようとして一日のほとんどを無駄にしました。アプリは、1台のPCから展開されたときにfindを実行しましたが、この1台のpc上では実行されませんでした。結局、それは欠落しているJavaの性質でした!奇妙なことに、Javaビルドパス、注文/エクスポート、およびJavaの性質をまだ持っていなかったすべてがどのように表示されたのか。 :(これが他の人の時間を大幅に節約することを願っています
SimonSaysActivityはどのインターフェイスまたは親クラスを使用/拡張しますか。また、使用しているAndroidのバージョンで使用できますか?私が使っていたAndroidのバージョンでは利用できなかったAPIインターフェースを私のアクティビティが実装している同様の問題を見てきました。
私の場合、アクティビティはAPI 14でのみ使用可能なPopupMenu.OnDismissListenerインターフェイスを実装しましたが、2.3デバイスでアプリを実行すると、アクティビティに対してJava.lang.NoClassDefFoundError例外を受け取りました。
すべてのヒントに従って(プライベートライブラリなどを確認した)まだバグがある場合。 application-tagでこのコード行のマニフェストを確認してください
Android:hasCode="false"
それを削除して幸せになります。 (ついに):)