1

数か月間ゲームに取り組んでいましたが、突然問題が発生しました。

昨日から、NoClassDefFoundエラーが発生しています。コードの変更はまったくありません。夜は働いていて、朝は働いていませんでした。まったく変化なし。正確なスタックトレースは次のとおりです。

06-23 23:12:19.746: E/ACRA(29146): Blue Boy fatal error : com.appaholics.blueboy.BlueBoy
06-23 23:12:19.746: E/ACRA(29146): java.lang.NoClassDefFoundError: com.appaholics.blueboy.BlueBoy
06-23 23:12:19.746: E/ACRA(29146):  at com.appaholics.blueboy.LoadingScreen.loadTextures(LoadingScreen.java:125)
06-23 23:12:19.746: E/ACRA(29146):  at com.appaholics.blueboy.LoadingScreen.load(LoadingScreen.java:85)
06-23 23:12:19.746: E/ACRA(29146):  at com.appaholics.blueboy.LoadingScreen.onCreate(LoadingScreen.java:40)
06-23 23:12:19.746: E/ACRA(29146):  at android.app.Activity.performCreate(Activity.java:4465)
06-23 23:12:19.746: E/ACRA(29146):  at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1049)
06-23 23:12:19.746: E/ACRA(29146):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1920)
06-23 23:12:19.746: E/ACRA(29146):  at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1981)
06-23 23:12:19.746: E/ACRA(29146):  at android.app.ActivityThread.access$600(ActivityThread.java:123)
06-23 23:12:19.746: E/ACRA(29146):  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1147)
06-23 23:12:19.746: E/ACRA(29146):  at android.os.Handler.dispatchMessage(Handler.java:99)
06-23 23:12:19.746: E/ACRA(29146):  at android.os.Looper.loop(Looper.java:137)
06-23 23:12:19.746: E/ACRA(29146):  at android.app.ActivityThread.main(ActivityThread.java:4424)
06-23 23:12:19.746: E/ACRA(29146):  at java.lang.reflect.Method.invokeNative(Native Method)
06-23 23:12:19.746: E/ACRA(29146):  at java.lang.reflect.Method.invoke(Method.java:511)
06-23 23:12:19.746: E/ACRA(29146):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784)
06-23 23:12:19.746: E/ACRA(29146):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)
06-23 23:12:19.746: E/ACRA(29146):  at dalvik.system.NativeStart.main(Native Method)

例外が発生するメソッド:

        private void loadTextures() {
        BlueBoy.sTextures = new HashMap<String,TextureRegion>();
        BlueBoy.sTiledTextures = new HashMap<String,TiledTextureRegion>();
        BlueBoy.sTextureHolders = new ArrayList<Texture>();
        BlueBoy.sHitVoiceSounds = new Sound[4];
        BlueBoy.sHitSounds = new Sound[4];
        BlueBoy.sWinSounds = new Sound[8];
        BlueBoy.sLoseSounds = new Sound[4];     
        Texture texture;
        TextureRegionFactory.setAssetBasePath("gfx/");
        BufferObjectManager.setActiveInstance(new BufferObjectManager());
        }

ただし、クラス BlueBoy は確実に存在します。確実に確認するために、私は自分のアプリを逆コンパイルしましたclasses.dex。.apk の作成中に生成されたものと .apk 自体の両方を逆コンパイルしました。クラスは両方に存在します。にも存在し/bin/classes/com/appaholics/blueboy/ます。逆コンパイルすると、当然のことながら、クラスの完全なソースが表示されます。

私はそれを修正するために考えてネット上で見つけることができるすべてを試しました。私は持っている:

  • その上でクリーンビルドを行いました
  • Eclipse でソースから新しいプロジェクトを作成しました
  • 新しいプロジェクトを作成し、手動ですべてをそれにシフトしました
  • クラスの名前を変更しようとしました
  • パッケージの名前を変更しようとしました
  • コマンドラインからコンパイルしてみました
  • コマンドラインからクリーニングしようとしました

ワークスペース内の他のすべてのプロジェクトは正常に動作します。

BlueBoy が正常に動作する前に起動される、スプラッシュ画面や読み込み画面などの他のクラス。Android はそれらを見つけることができます。

なぜこれが起こるのか、誰にも分かりますか?クラスは私が存在するのと同じくらい確実に存在しますが、Android は同意しません。

編集: duffymo の提案に従って、スプラッシュ スクリーンに以下を追加して、このクラスの存在についてクラス パスを確認します。

       try {
          Class.forName("com.appaholics.blueboy.BlueBoy", false, null);
       } catch (ClassNotFoundException e1) {
          Log.d("ClassCheck", "Not found.");
          e1.printStackTrace();
       }

Not FoundLogCat でメッセージを取得します。クラスがクラスパスにないことがわかったので、どうすれば修正できますか? このクラスは、スプラッシュ スクリーンと読み込みクラスと同じパッケージにあり、それらの両方が存在します。この 1 つのクラスが存在しない原因は何ですか?どうすれば修正できますか?

EDIT2: FWIW、System.getProperties("java.class.path");" " を返します.

4

2 に答える 2

1

私はそれを修正することができました。これらは私が行った正確な手順です:

  • すべてのコンテンツを新しいプロジェクトに手動で複製します。このオプションを使用して、既存のソースからプロジェクトを作成しないでください。
  • プロジェクトのプロパティに移動し、ビルド パスから android.jar を削除します。
  • 保存
  • 以前と同じバージョンの Android 用であることを確認して、手動で jar を追加し直します。

今すぐ動作するはずです。元のプロジェクトとそのソースから作成したプロジェクトの両方で上記の手順を試しましたが、うまくいきませんでした。

なぜ、どのように機能するのかはわかりませんが、機能することはわかっています。FWIW、私はSDKツール19とプラットフォームツール11でADT 18を使用しています。

于 2012-06-23T20:09:59.887 に答える
0

私の問題は、クラスのメソッドが、Android マニフェストで設定された最小 API レベルよりも高いメソッド呼び出しを使用していたことです。クラスを最小 API レベルと互換性を持たせることで、問題が修正されました。この問題は、Android Lint チェックを実行することで検出できます。これにより、問題の原因となっているメソッド呼び出しが正確にわかります。

于 2015-01-17T20:03:38.923 に答える