0

scala と AndroidProguardScala の性質を追加した eclipse に libgdx Android プロジェクトがあります。これはうまく機能していましたが、突然Eclipseが「ビルドパスに複数のScalaライブラリが見つかりました」という警告を出し始めました。プロジェクトをビルドしてデバイスにインストールすることはできますが、すぐに で終了するNoClassDefFoundError: scala.Tuple2$mcZZ$spため、Scala ライブラリがまったく含まれていないように見えます。

私のプロジェクトには、「Scala Library [2.10.1]」(「scala-library.jar」として)と「Android Dependencies」(「scala_library.min.jar」として)の両方にScalaライブラリがあるようです。 Proguard の出力が元のライブラリと競合していますが、これが発生した理由や修正方法がわかりません。

この時点で、新しいプロジェクトを作成してソース ファイルをコピーするだけで済みますが、誰かがこれに光を当てることができれば素晴らしいことです。

編集:いくつかの実験の後、このコード (トレイトのメソッド内から) が問題を引き起こしているように思われることが判明しました。

acckeys match {
  case (true, false) => acceleration.set(0, accel).rotate(rotation)
  case (false, true) => acceleration.set(0, -accel).rotate(rotation)
  case _ => acceleration.set(0, 0)
}

(acckeys は a を返す関数tupleacceleration、ベクトルです)

複数のライブラリの警告はまだ残っているので、問題とは関係ないと思います。幸いなことに、Android バージョンのプロジェクトからこのコードを実際に参照する必要はありませんが、このコードがコンパイルされても実行に失敗する理由を知ることは依然として役に立ちます。

4

2 に答える 2

0

Proguard 構成ファイルに問題がある場合、同様のメッセージが表示されます。あなたはチェックするかもしれません:

  • Proguard が実行されているか
  • 構成ファイルには次のものがあります: -keep public class **.YourPackage.** またはそのようなもの
  • 構成ファイルは、Scala ライブラリ用に変更されています。

    ## スカラ設定
    
    -dontwarn **$$anonfun$$*
    -dontwarn scala.android.**
    -dontwarn scala.beans.ScalaBeanInfo
    -dontwarn scala.collection.generic.GenTraversableFactory
    -dontwarn scala.collection.immutable.RedBlack$Empty
    -dontwarn scala.concurrent.forkjoin.**
    -dontwarn scala.reflect.**
    -dontwarn scala.sys.process.**
    -dontwarn scala.tools.**,plugintemplate.**
    
    
    #(org.xml.sax.EntityResolver)Class.forName(変数).newInstance()
    -dontnote org.xml.sax.EntityResolver
    
      #(org.apache.james.mime4j.storage.StorageProvider)Class.forName(変数).newInstance()
    -dontnote org.apache.james.mime4j.storage.DefaultStorageProvider
    
    -dontnote scala.android.app.Activity
    
    
    -クラスscala.android.packageを保持**
    -keep class * extends scala.android.app.Activity
    
    ## 修正 ==> 警告: ... 参照されたクラス sun.misc.Unsafe が見つかりません
    -libraryjars D:\Program Files\Apache\m2\repository\com\google\code\findbugs\jsr305\2.0.1\jsr305-2.0.1.jar
    -dontwarn sun.misc.Unsafe
    
    
    -keep class * extends scala.runtime.MethodCache {
        公衆 ;
    }
    
    -keepclassmembers クラス * {
        **モジュール$;
    }
    
    -keepclassmembernames class scala.concurrent.forkjoin.ForkJoinPool {
        長い eventCount;
        int workerCounts;
        int runControl;
        scala.concurrent.forkjoin.ForkJoinPool$WaitQueueNode syncStack;
        scala.concurrent.forkjoin.ForkJoinPool$WaitQueueNode SpareStack;
    }
    
    -keepclassmembernames class scala.concurrent.forkjoin.ForkJoinWorkerThread {
        int ベース;
        int sp;
        int runState;
    }
    
    -keepclassmembernames class scala.concurrent.forkjoin.ForkJoinTask {
        int ステータス;
    }
    
    -keepclassmembernames class scala.concurrent.forkjoin.LinkedTransferQueue {
        scala.concurrent.forkjoin.LinkedTransferQueue$PaddedAtomicReference head;
        scala.concurrent.forkjoin.LinkedTransferQueue$PaddedAtomicReference テール;
        scala.concurrent.forkjoin.LinkedTransferQueue$PaddedAtomicReference cleanMe;
    }
    
于 2013-04-24T17:33:16.667 に答える
0

私はあなたが抱えている問題を正確に知っています。これは、AndroidProgaurdScala がメイン プロジェクトにあるクラス ファイルを認識しないことに関係しています。その結果、Android プロジェクトで定義されているすべてのクラスが含まれますが、タプルなどの「新しい」クラスはすべて欠落し、そのため素晴らしい NoClassDefFoundError が発生します。「ビルド パスに複数の Scala ライブラリが見つかりました」という警告は表示されませんでしたが、プロジェクトに scala の性質を追加し、その上に library.jar も追加したことを意味している可能性があります。設定を元に戻し、以下の内容に従ってください。それ以外の場合は、以下の手順で新しいプロジェクトをセットアップし、ソースをコピーしてください。

Scala Nature と Android Proguard Scala は、面倒なことをした後に修正するのが少し面倒であることがわかりました。あなたが既存のプロジェクトを救えるとは 100% 確信が持てませんが、どうなるか試してみることはできます。まず、プロジェクトからすべての scala 関連の性質を削除し、単純な古い Java プロジェクトの初期状態に戻します。

Scala を使用して libGDX をセットアップする手順を説明し、どこで問題が発生したかを見てみましょう。

  1. 環境が正しく設定されていることを確認してください。(注:最新バージョンを入手する必要があります)
  2. 通常どおり libGDX プロジェクトをセットアップします。(または、あなたの場合は既存のプロジェクトを使用してください)
  3. Android プロジェクトを右クリックし、「Scala ネイチャーを追加」してから「AndroidProgaurdScala ネイチャーを追加」
  4. メイン プロジェクトを右クリックし、「Scala nature を追加」
  5. デスクトップ プロジェクトを右クリックし、「Scala nature を追加」

さて、これはおそらくすでに到達した場所ですが、メイン プロジェクトにどのクラスがあるかを AndroidProgaurdScala が認識していないという問題がまだあります。含まれているプロジェクトを見落としているようで、それらを scala_library.min.jar に追加していません。これを修正するために、うまく機能する1つの解決策を見つけました:

  1. Android プロジェクトを右クリック > プロパティ > Java ビルド パス
  2. [プロジェクト] タブに移動し、メイン プロジェクトを削除します。これが直感に反していることはわかっていますが、信じてください。
  3. ソース タブ > リンク ソース... に移動します。
  4. メインプロジェクトから「src」フォルダーに移動して選択します
  5. OKを押します
  6. プロジェクトをクリーンアップして再構築します。

このセットアップは、私がテストし、問題なく広範囲に使用しました。Android 版とデスクトップ版はどちらも問題なく動作し、Scala や混合コードでも問題なく動作します。Android プロジェクトは、ソースが Android プロジェクトのビルドにコピーされるようになったため、メイン プロジェクトで使用しているすべての Scala クラスを完全に認識するようになりました。(つまり、NoClassDefFoundError は、Scala 関連のものには表示されません)。

于 2013-04-24T17:26:39.690 に答える