web-dev-qa-db-ja.com

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>

これを修正する方法がわからないので、助けていただければ幸いです。この特定の動作を見ることなく、SOで多くの同様の質問をスキャンしました。

詳細:

  • 生成されたAPKの内部を確認しました。クラスには、classes.dexファイルにエントリがあります
  • Eclipseでプロジェクトをクリーニング/ビルドしてみました
  • APKのコピーがまだないまったく新しいデバイスイメージを使用してみました
  • ライブラリプロジェクトを通常のJavaに変更してから、Androidプロジェクトに戻しました。違いはありません。
  • マニフェストに抽象SimonSaysActivityを追加しても違いはありません。
  • すべての依存関係をAndroidライブラリプロジェクトにし、必要なAndroidバージョンを同期しようとしましたが、役に立ちませんでした

ソリューションを見つけました(以下を参照)。回答/コメントを投稿したすべての人に:あなたはすべて揺れます、問題を解決するのを手伝ってくれてありがとう!

これは、SDKツールのアップグレードによって導入されたようです。このリンクのコメントにある@Nickに感謝します。 http://iqadd.com/item/noclassdeffounderror-adt-fix

80

私は自分のプロジェクトでしばらく時間を費やしましたが、メインプロジェクトを実行しようとすると、問題を再現し、まったく同じ例外スタックトレースを取得することができますので、これが原因だと思います:

私が考えていたのと同じように、シンプルなEclipse構成設定であるAndroidメインプロジェクトでAndroidライブラリプロジェクトを参照する方法がすべてです。

間違った方法:
メインプロジェクトを右クリックし、Properties -> Java Build Path -> Projects -> Add...を選択します。これにより、AndroidライブラリプロジェクトがAndroidメインプロジェクトのビルドパスの依存関係プロジェクトとして追加されます。これは機能しません。必要なすべてのAndroid関連リソースがメインプロジェクトで定義されている場合、コンパイル時にエラーは発生しませんが、アプリケーションを実行すると、質問で説明されている例外が発生します。

正しい方法:
メインプロジェクトを右クリックして、Properties -> Androidを選択し、[ライブラリ]セクションでAndroidライブラリプロジェクトをここに追加します。公式開発者ガイドをご覧ください ライブラリプロジェクトの参照 。これですべての問題が解決するはずです。 ライブラリプロジェクト-開発の考慮事項 で説明されているように、実際のAndroidライブラリプロジェクトを参照する相対パスを使用する必要があることにも注意してください。

お役に立てれば。

147
yorkw

私はあなたが与えたコードをテストしました、そしてそれはうまく働きます。 「SimonSaysActivityを拡張する」を単に「アクティビティを拡張する」に変更してみて、それが機能することを確認してください。

動作しない理由は、SimonSaysActivityがActivityを拡張していない(この間違いを犯したとは思わない)か、ビルドパスの順序が間違っているためです。

ビルドパスの順序に移動するには、次の場所に移動します。

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

私の基本的な順序は次のとおりです。プロジェクトsrc、プロジェクトgen、Android 4.0.3、Android依存関係。

この問題は通常、ライブラリを使用するときに発生します。

8

アプリをフレームワークライブラリとアプリケーションにリファクタリングしました。

ここで何を言おうとしているのか完全にはわかりませんが、ここで「リファクタリングされた」という言葉を使ったという事実は、あなたが図書館プロジェクトの概念を誤解していると信じさせてくれます。


図書館プロジェクト 

ライブラリプロジェクトは、共有ソースコードとリソースを含む開発プロジェクトです。他のAndroidプロジェクトは、ライブラリプロジェクトを参照し、コンパイル時に.apkファイルにコンパイル済みソースを含めることができます。

図書館プロジェクト ではない

ライブラリプロジェクトは、単一の.apkファイルに直接コンパイルしてAndroidデバイスで実行できないという点で、標準のAndroidプロジェクトとは異なります。 Androidプロジェクトをライブラリプロジェクトとして使用してから、別のAndroidプロジェクトextendを使用することはできません。ライブラリプロジェクト。それはそのようには機能しません。


そうは言っても、ライブラリプロジェクトの構造を調査し、 正しくセットアップする であることを確認します。ライブラリを使用して共有コード/リソースを保存することは問題ありませんが、ライブラリがライブラリプロジェクト自体の中で別の.apkであるかのように動作しようとしている場合、おそらく何か間違ったことをしているでしょう。この場合、ClassNotFoundExceptionがスローされると思います。この問題を解決するには、Androidプロジェクトをライブラリプロジェクトに変換するのではなく、ライブラリプロジェクトをゼロからビルドするだけです。これにより、小さな厄介なバグに遭遇することを防ぎます。

それでも問題が解決しない場合は、より多くのコードを投稿してください。また、ライブラリプロジェクトの構造(および目的)についてもう少し詳しく説明する必要があります。なぜそれを使用することにしたのか、どのように作成したのかなどです。

2
Alex Lockwood

Eclipse Kepler(Mac)の場合:Controlキーを押しながらプロジェクトをクリック-> Androidツール->サポートライブラリを追加

2
PSchuette

私のケースは異なりましたが、私が取り組んでいたプロジェクトでこの問題が発生しました。それでも問題の解決策が見つからない場合は、これを確認してください。

Eclipseの場合:

Project properties -> Java Build Path -> Source tab

内部には、コンパイルされるすべてのソースフォルダーのリストがあり、プロジェクトをビルドするたびに生成されたapkに入れられます(そして / gen)。一般的に:

>MyProject/gen
>MyProject/src

確認する必要があるのは、各ソースフォルダー内です(除外 / gen、そうだけ / src この場合)アイテムOutput folderはデフォルトの出力フォルダーMyProject/bin/classesにポイティングしています。これを行うには、[出力フォルダー]を選択し、右側のボタンセットから[削除]をクリックします(これにより、既定のフォルダーを指すようになります)。

サブアイテムの出力フォルダーが表示されない場合は、リストのすぐ下にある[ソースフォルダーの出力フォルダーを許可する]をオンにします。

2
Gonzalo

binsからclasses.dexを削除し、プロジェクトを再構築します

1
Afzaal Iftikhar

これはすべての人に当てはまるわけではありませんが、プロジェクトがデバイス上にある共有ライブラリとリンクできなかったため、最近この問題が発生しました。 マニフェストで指定 アプリケーション<uses-library>を忘れていました。

1
lase

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の対処方法

  1. 要求されたクラスの名前が正しいこと、および適切な.jarファイルがclasspath。そうでない場合は、アプリケーションのクラスパスに明示的に追加する必要があります。
  2. 指定された.jarファイルがクラスパスに存在する場合、アプリケーションのクラスパスがオーバーライドされているため、アプリケーションで使用されている正確なクラスパスを見つける必要があります。
  3. 例外の原因がサードパーティのクラスである場合、例外をスローするクラスを特定してから、欠落している。jarファイルを追加する必要がありますclasspath
1
IntelliJ Amiya

@yorkwが提供するソリューションは完全に正しいです。追加の問題がありました。レイアウトファイルの1つで、絶対名が間違って言及されていました。あるべきだった

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

むしろ私はそれを置いていた

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

これらを解決した後、うまくいきました。

0
Himadri Pant

信じられないかもしれませんが、私が修正したのは、すべてを4時間以上試した後、Googleアナリティクスライブラリの古いバージョン(2.0)をプロジェクトから削除することでした。もちろん、このライブラリの更新も解決策になる可能性があります。そのため、依存関係のjarバージョン管理の問題である可能性があります。

0
Criss

私は同じ問題を抱えていて、あらゆる種類のことをしようとして一日のほとんどを無駄にしました。アプリは、1台のPCから展開されたときにfindを実行しましたが、この1台のpc上では実行されませんでした。結局、それは欠落しているJavaの性質でした!奇妙なことに、Javaビルドパス、注文/エクスポート、およびJavaの性質をまだ持っていなかったすべてがどのように表示されたのか。 :(これが他の人の時間を大幅に節約することを願っています

0
Luke

SimonSaysActivityはどのインターフェイスまたは親クラスを使用/拡張しますか。また、使用しているAndroidのバージョンで使用できますか?私が使っていたAndroidのバージョンでは利用できなかったAPIインターフェースを私のアクティビティが実装している同様の問題を見てきました。

私の場合、アクティビティはAPI 14でのみ使用可能なPopupMenu.OnDismissListenerインターフェイスを実装しましたが、2.3デバイスでアプリを実行すると、アクティビティに対してJava.lang.NoClassDefFoundError例外を受け取りました。

0
Charles Harley

すべてのヒントに従って(プライベートライブラリなどを確認した)まだバグがある場合。 application-tagでこのコード行のマニフェストを確認してください

    Android:hasCode="false" 

それを削除して幸せになります。 (ついに):)

0
Corona