web-dev-qa-db-ja.com

Java上のAndroidライブラリのコードのNoClassDefFoundError

ユーザー間で頻繁にエラーが発生します。起動中にアプリがクラッシュします。 MainActivityがロードされることになっている場合、VMは明らかにクラスを見つけることができません。理由がわかりません。アプリのアーキテクチャは、無料版とプロ版の両方が使用している共通のプロジェクトがあることです。それが関連するかどうかわからない。以下のスタックトレースを参照してください。何かご意見は?

Java.lang.NoClassDefFoundError: com.Android.common.MainActivity
at com.mycompany.myapp.Splash.onCreate(Splash.Java:23)
at Android.app.Instrumentation.callActivityOnCreate(Instrumentation.Java:1047)
at Android.app.ActivityThread.performLaunchActivity(ActivityThread.Java:1615)
at Android.app.ActivityThread.handleLaunchActivity(ActivityThread.Java:1667)
at Android.app.ActivityThread.access$1500(ActivityThread.Java:117)
at Android.app.ActivityThread$H.handleMessage(ActivityThread.Java:935)
at Android.os.Handler.dispatchMessage(Handler.Java:99)
at Android.os.Looper.loop(Looper.Java:130)
at Android.app.ActivityThread.main(ActivityThread.Java:3687)
at Java.lang.reflect.Method.invokeNative(Native Method)
at Java.lang.reflect.Method.invoke(Method.Java:507)
at com.Android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.Java:842)
at com.Android.internal.os.ZygoteInit.main(ZygoteInit.Java:600)
at dalvik.system.NativeStart.main(Native Method)
Caused by: Java.lang.ClassNotFoundException: com.Android.common.MainActivity in loader     dalvik.system.PathClassLoader[/system/framework/com.google.Android.maps.jar:/data/app/com.Android.pro-1.apk]

編集:以下のコメントをありがとう、リチャード。 com.Android.Splashを別のものに変更しました。とにかく実際のクラス名ではありませんでした。私の悪い...!

75
kjoelbro

私は同じ問題を抱えていました。問題を解決するために次のことをしました。

  1. プロジェクトの「プロパティ」に移動します。
  2. 「Java Build Path」を選択します
  3. [注文とエクスポート]タブを選択します
  4. 選択したプロジェクトの「src」および「gen」パスと依存関係がここに表示されます。
  5. リストの順序は、最初に「src」、次に「gen」のパスでした
  6. それらを切り替えて、「gen」フォルダーが「src」の前にビルドされるようにします

gen-プロジェクトの自動化されたコード(依存関係と参照から)
src-プロジェクトのソースコード

Eclipseを再起動する必要はありませんでした。動き始めたばかりです。

正直なところ、「Androidツール>プロジェクトプロパティの修正」を試したことはありませんが、同じことをしている場合もあります。私は知りません。エラーメッセージを見た後、ビルドパスに何か問題があると思った後、上記のようにしました。


編集


後でそれは十分ではなかった、私は再びエラーを取得していました。次に、そのビューにリストされているすべての依存関係を「チェック」しました。今では再び動作します。ここまでは順調ですね。再度失敗した場合は、これを更新し続けます。

FYI:前回の試みで、「Androidツール>プロジェクトプロパティの修正」を試しましたが、うまくいきませんでした。

125
Sabo

現在、SDK 20.0.3を使用していますが、以前のソリューションはどれも役に立ちませんでした。

私は物事を機能させることができました

  • Androidプロジェクトを右クリックします
  • 次に、[パスのビルド]-> [ソースのリンク]を選択して、[ソースのリンク]ダイアログを表示します。
  • 次に、Javaプロジェクトの「src」フォルダーを指定し、デフォルトの「src」以外の名前を付けました(例:「src2」)。
  • これで、右クリック->新しい「src2」フォルダーを削除できます。

これにより、Javaプロジェクトのビルド時にVM JavaではなくDalvik VM用にコンパイルされたAndroidクラスファイルが作成されました。これにより、Javaプロジェクトの.apkが作成されたときに、Androidライブラリjarファイル内のAndroidクラスファイルがデキシングを実行できました。これで、アプリの実行時に、Java.lang.NoClassDefFoundErrorがスローされる代わりに、Javaプロジェクトクラスが見つかりました。

ソースをリンクする代わりにjarファイルを使用する場合は、ライブラリAndroidプロジェクトを作成する必要があります。 ([プロパティ]-> [Android]で[ライブラリ]がオンになっているAndroidプロジェクト。)JavaプロジェクトのソースをAndroidライブラリプロジェクトにリンクする必要があります。または、ソースファイルをJavaプロジェクトの 'src'フォルダーからAndroidライブラリプロジェクトの 'src'フォルダーにコピーします。 Android Libraryプロジェクトをビルドします。次に、Androidフォルダーの 'libs'フォルダーに作成されたAndroidプロジェクトjarファイルをコピーできます。これは、その中のクラスファイルがDavlik VMの代わりにコンパイルされたためです。 JavaプロジェクトがビルドされたときのVM Android。これにより、Javaプロジェクトの.apkが作成されたときに、AndroidライブラリjarファイルのAndroidクラスファイルがdexingを実行できます。これで、アプリが実行されると、Java.lang.NoClassDefFoundErrorがスローされる代わりに、Javaプロジェクトクラスが見つかります。

18

[プロジェクト]-> [プロパティ]-> Javaビルドパス-> [注文とエクスポート]に移動して、プロジェクトおよび使用している他のすべてのライブラリプロジェクトのAndroidプライベートライブラリを確認します。以下のリンクに従って解決策を得ました NoClassDefFoundError Android Project

17
samm

それが誰かを助けるために、私は同じ問題に直面しました。私のjarファイルはlibsディレクトリの下にあり、jarはビルドパスに追加されました。それでも、それはその例外を投げていました。

私はちょうどプロジェクトをきれいにし、それは私のために働いた。

Eclipse->プロジェクト->クリーン->プロジェクトを選択してクリーン

8
Souvik Ghosh

上記のすべてのソリューションを試しましたが、うまくいきませんでした、プロジェクト->構成ビルドパス->順序とエクスポート->依存プロジェクトを上に移動する

7
DD.

このエラーは、Google API(Mapsなど)を使用するアプリを作成したが、Android AP​​Iをターゲットとするデバイスで実行した場合にも生成されます。

6
T. Markle

Java.nio.charset.StandardCharsetsを使用したときに、このNoClassDefFoundErrorが発生しました。

その理由は、StandardCharsetsはJRE 1.7まで存在しなかったためです。 Javaコンパイルバージョンを1.7に設定すると、Eclipseは「Androidにはコンパイラー準拠レベル5.0または6.0が必要です」と不平を言いました。そのため、プロジェクト名を右クリックして、[Androidツール]、[プロジェクトプロパティの修正]の順にクリックして修正しました。 JRE1.6でコンパイルされます。

ただし、StandardCharsetsは1.7まで存在しなかったためです。実行したときにNoClassDefFoundErrorが報告されました。

JDKの再インストールを含む他の多くの方法を試した後、私はこれに気づきませんでした。本当の理由は、NoClassDefFoundErrorの意味によって明確に示されています。コンパイルに合格しましたが、実行時にクラスが見つかりません。

一般的な結論としては、AndroidがJRE 1.7で機能しない限り、1.7以降で提供される新しい機能を使用すると、このエラーが発生します。

私の解決策は、それらのソースコードをコードにコピーすることです!

5
gm2008

NoClassDefFoundErrorの説明は、SOタグからのものです。

Java仮想マシンまたはClassLoaderインスタンスが(通常のメソッド呼び出しの一部として、または新しいインスタンスの作成の一部として)クラスの定義を読み込もうとした場合にスローされるJavaエラー新しい式を使用して)クラスの定義が見つかりませんでした。検索対象のクラス定義は、現在実行中のクラスがコンパイルされたときに存在していましたが、定義はもう見つかりません。

またはそれ以上:

JavaのNoClassDefFoundErrorは、Java仮想マシンがコンパイル時に使用可能な実行時に特定のクラスを見つけられない場合に発生します。

from this ページ。チェックしてください。エラーを解決する方法がいくつかあります。役に立てば幸いです。

4
Alberto Solano

私の場合、jre 1.7でコンパイルされた通常のJavaクラスを(通常のJavaプロジェクトから)jreでコンパイルされたAndroidアプリプロジェクトに追加しようとしました1.7。

解決策は、通常のJavaクラスをjre 1.6で再コンパイルし、(jre 1.6でコンパイルされた)Androidアプリプロジェクトへの参照を通常どおり(タブオーダーとエクスポートで必ずクラス、プロジェクトなどを確認してください。

Androidライブラリを使用して外部の通常のJavaクラスを参照するときの同じプロセス。

通常のJavaクラスを通常のJavaプロジェクトからコンパイルし、AndroidアプリまたはAndroidライブラリプロジェクト。

通常のJavaクラスを使用しない場合(通常のJavaプロジェクトから)、jre 1.6にダウングレードする必要はありません。

4
cfc

私にとって、この問題は、デプロイされていないAPIに関連していた。たとえば、参照としてZSDK_API.jarを使用しました。

この問題を解決するには、プロジェクトを右クリックしてプロパティを選択する必要がありました。 Java BUILD PATHから、デプロイされていないAPIを追加する必要がありました。アプリが見つからないMainActivityクラスをスローし、実際にはエラーはDiscoveryHandlerクラスが見つからないことが原因であるため、これは奇妙でした。

これが誰かを助けることを願っています。

3
Tomasz

オンAndroid Studio:

1)multiDexEnabled = trueを追加default Config

2)コンパイルを追加com.Android.support:multidex:1.0.0依存関係

Application class extend MultiDexApplication単なるApplicationの代わりに

2
Fred Sousa

プロジェクトに存在するクラス(ライブラリクラスではない)のNoClassDefFoundErrorに出会いました。クラスは存在しますが、NoClassDefFoundErrorが発生しました。私の場合、問題はマルチデックスのサポートでした。問題と解決策はこちらです: Android Multidex and support libraries

5.0より前のAndroidバージョンでこのエラーが発生します。

2
Murat

他のアイデア。たとえば、「Android.support.v4.app.Fragment」から派生したクラスがあります。

ただし、間違えて「Android.app.Fragment」から継承しました。次に、Android 2デバイスでこのエラーが発生します。

1
Manushin Igor

共通ライブラリの作成時にjavacのターゲットを指定しないので、javacは利用可能な最新のターゲット(おそらく1.7(Java7)または1.8(Java8))を自動的に使用します。

それはすでに述べられています

Androidには、コンパイラー準拠レベル5.0または6.0が必要です

dx Androidのビルドツール<19.0.0では、Java7(またはそれ以上)バイトコードをDalvikバイトコードに変換できません。

したがって、ビルドツールバージョン> = 19.0.0を使用するか、またはjavac-target 6とともに使用して、たとえばant build.xmlを次のように変更します。

<javac
srcdir="src/"
destdir="build/"
target="6"
/>
1
Flow

このエラーで何かを見つけたところです。

ライブラリjarファイルにAndroid.support.v7.appcompatパッケージの下にコンパイル済みのRクラスが含まれていることを確認し、Android_SDK_HOME/extras/Android/support/v7/appcompatフォルダーのv7 appcompatサポート「プロジェクト」のすべての解像度をコピーします。

NetbeansをAndroidプラグインと一緒に使用すると、問題が解決しました。

1
Marthinus Botha

上記のいずれも機能しなかった場合(私の場合)、Eclipseの別のプロジェクトをライブラリとして使用しています。

そうします:プロジェクトを右クリック->プロパティ-> Android->ライブラリ->追加

それは私のためにそれをしました! プロジェクトをライブラリとして追加する(プロジェクトプロパティ)

0
Feiteira

jarは以前はlib /フォルダーにありましたが、現在はlibs /にあります。libを使用する場合、jarをlibからlibsに移動し、Androidのためにプロジェクトプロパティ/ Javaビルドパスから依存関係を削除できます_は自動的にそれらを見つけます。

0
Christine

ソリューション:

  1. リストアイテム
  2. 輸出順を確認する
  3. マルチデックスを有効にする
  4. レイアウトのビューのAPIレベルを確認します。 searchViewでも同じ問題に直面しました。 searchviewを追加するときにAPIレベルをチェックしましたが、SearchView.OnQueryTextListenerの実装をクラスファイルに追加しました。

マニフェストにアクティビティが再び追加されました。マニフェストで試したところ、アプリが動作しました。

 <activity
        Android:name="com.xxx.xxx.MainActivity"
0
devcelebi

私にとって問題は、参照ライブラリがJava 7を使用して構築されたことでした。1.6JDKを使用して再構築することでこれを解決しました。

0
theannouncer

Project.propertiedにライブラリプロジェクトパスを手動で追加して、この問題を修正しました。 Eclipseがこのエントリを「プロジェクトの追加」とともに自動的に追加しなかった方法。そのため、アプリがlibプロジェクト内のコンポーネントを参照しようとした時点でクラッシュしていました。

同じことを試すこともできます。 projec.propertiesのアプリ依存

Android.library.reference.1 = ....\Android-sdks\extras\google\google_play_services\libproject/google-play-services_lib

実行します。

時々Java.lang.NoClassDefFoundError:Dalvikランタイムの代わりにARTを使用するとエラーが表示されます。ランタイムを変更するには、開発者オプション->ランタイムの選択-> Dalvikに移動します。

0

に行ってみてください

  • プロジェクトを右クリック
  • Javaビルドパス
  • ソース
  • 右側->フォルダの追加ボタン
  • 選択したlibsフォルダーとOK

役に立てば幸いです。

0
zxbin