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し、[ライブラリ] セクションで Android ライブラリ プロジェクトをここに追加します。公式の開発者ガイドライブラリ プロジェクトの参照を確認してください。これですべての問題が解決するはずです。ライブラリ プロジェクト - 開発に関する考慮事項に記載されているように、実際の Android ライブラリ プロジェクトを参照する相対パスを使用する必要があることにも注意してください。

お役に立てれば。

于 2012-06-09T23:42:58.517 に答える
8

私はあなたが与えたコードをテストしました、そしてそれはうまくいきます。「extends SimonSaysActivity」を単に「extends Activity」に変更してみて、それが機能することを自分で確認してください。

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

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

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

私の基本的な順序は、プロジェクト src 、プロジェクト gen 、アンドロイド 4.0.3 、アンドロイド依存関係です。

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

于 2012-06-02T22:58:43.467 に答える
2

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

于 2013-10-18T23:27:12.550 に答える
2

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

エクリプスでは:

Project properties -> Java Build Path -> Source tab

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

>MyProject/gen
>MyProject/src

確認したいのは、各ソースフォルダー ( /genを除外するため、この場合は/srcのみ) 内で、項目Output folderがデフォルトの出力フォルダー ( MyProject/bin/classes. これを行うには、[出力フォルダー] を選択し、右側のボタン セットから [削除] をクリックします (これにより、既定のフォルダーがポイントされます)。

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

于 2014-05-22T23:00:33.813 に答える
2

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

ここで何を言おうとしているのかよくわかりませんが、ここで「リファクタリング」という言葉を使用したという事実から、ライブラリ プロジェクトの概念を誤解していると思われます。


ライブラリ プロジェクトとは:

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

ないライブラリ プロジェクト:

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


とはいえ、ライブラリ プロジェクトの構造を調査し、正しく設定されていることを確認いたします。ライブラリを使用して共有コード/リソースを保存することは.apk問題ありませんが、ライブラリがライブラリ プロジェクト自体内で別のものであるかのように動作しようとしている場合は、おそらく何か問題があります。ClassNotFoundExceptionこの場合、 a がスローされると思います。この問題を解決するには、Android プロジェクトをライブラリ プロジェクトに変換するのではなく、ライブラリ プロジェクトをゼロからビルドします。これにより、小さな迷惑なバグに遭遇するのを防ぐことができます.

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

于 2012-06-09T18:44:25.933 に答える
1

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

于 2016-02-25T14:21:52.377 に答える
1

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

    android:hasCode="false" 

それを取り除いて幸せになってください。(私はついにそうでした):)

于 2013-09-23T12:31:33.047 に答える
0

@yorkw が提供する解決策は絶対に正しいです。追加の問題がありました。レイアウト ファイルの 1 つで、絶対名を間違って言及していました。だったはず

<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) の Google アナリティクス ライブラリをプロジェクトから削除することでした。もちろん、このライブラリの更新も解決策になる可能性があります。したがって、依存関係の jar バージョン管理の問題である可能性があります。

于 2015-05-07T23:06:54.227 に答える
0

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

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

于 2012-06-02T23:02:59.733 に答える
-1

私は同じ問題を抱えていました。しかし、その後、アプリケーションの現在の構造を確認しました.古いアプリケーション構造(Androidフレームワーク開発者によって変更された時期はわかりません)には、"lib"現在のフォルダ名があることがわかりました"libs". すべてのjarファイルを「libs」に移行すると、エラーはなくなりました。これが誰かに役立つことを願っています:)

于 2014-02-11T09:31:28.760 に答える