11

私はゲーム プロジェクトをプラットフォームに完全に依存しないようにしようとしたので、エンジン、ゲーム、Android ゲームのように、低レベルから最上位の Android 固有レベルまでの3 つのプロジェクトに分割しました。

エラーに含まれるクラス/インターフェースは次のとおりです。

  1. (低レベル) エンジン プロジェクトは、次のインターフェイスを定義します。

    com.myteam.engine.IGame
    
  2. (中間レベル) プラットフォームに依存しないゲーム プロジェクトでは、これらのクラスが定義されています。

    com.myteam.myproject.Game
    com.myteam.myproject.MyProject (derived from com.myteam.myproject.Game)
    
  3. (最上位) android プロジェクトはアクティビティなどを実装します。

    com.myteam.myproject.android.MyAndroidActivity (using com.myteam.myproject.MyProject)
    

すべてが適切にコンパイルされ、Windows で完全に実行されます (レベル 3 の別の Windows プロジェクトで最初の 2 つを使用)。

ただし、ADT を使用して実行すると、実行時にアクティビティの開始時に失敗します。Android アプリは基本的に、"NoClassDefFoundError com.myteam.myproject.MyProject" 例外を含むコール スタックを表示するだけです。

LogCat 出力が示すように、ロード/解決中に、そのスーパー クラス (またはスーパー クラスのインターフェイス) によって例外が発生したようです。

12-20 19:51:51.897: D/ddm-heap(218): Got feature list request
12-20 19:51:52.207: I/dalvikvm(218): Failed resolving Lcom/myteam/myproject/Game; interface 18 'Lcom/myteam/engine/IGame;'
12-20 19:51:52.217: W/dalvikvm(218): Link of class 'Lcom/myteam/myproject/Game;' failed
12-20 19:51:52.227: W/dalvikvm(218): Unable to resolve superclass of Lcom/myteam/myproject/MyProject; (52)
12-20 19:51:52.227: W/dalvikvm(218): Link of class 'Lcom/myteam/myproject/MyProject;' failed
12-20 19:51:52.227: E/dalvikvm(218): Could not find class 'com.myteam.myproject.MyProject', referenced from method com.myteam.myproject.android.MyAndroidActivity.onCreate
12-20 19:51:52.227: W/dalvikvm(218): VFY: unable to resolve new-instance 54 (Lcom/myteam/myproject/MyProject;) in Lcom/myteam/myproject/android/Youcode_AndroidActivity;
12-20 19:51:52.227: D/dalvikvm(218): VFY: replacing opcode 0x22 at 0x0008
12-20 19:51:52.227: D/dalvikvm(218): Making a copy of Lcom/myteam/myproject/android/Youcode_AndroidActivity;.onCreate code (88 bytes)

他の投稿やフォーラムで説明されているように、Android ゲーム プロジェクトの「Build Path / Order and Export」Eclipse プロジェクト設定の下に最初の 2 つのプロジェクトを追加しようとしましたが、何も変わりません。

私の推測では、マニフェストまたはプロジェクトの設定には、apk パッケージまたはランタイムのパッケージ/クラスの依存関係について別の言及が必要です。何か案は?

4

7 に答える 7

12

私はあなたとほとんど同じように、3層のAndroid /Javaアプリを持っています:

  1. 低レベルのネットワーク通信のためのJavaのみのプロジェクト
  2. 低レベルプロジェクトの機能を抽象化するJavaのみのプロジェクト
  3. Androidアプリ

上記のそれぞれは、単一のワークスペースに含まれる個別のEclipseプロジェクトです。

これがあなたがする必要があることです:

  1. アプリのプロジェクトプロパティ->Javaビルドパス->プロジェクトで、Javaのみのプロジェクトを追加します
  2. アプリのプロジェクトプロパティ->Javaビルドパス->注文とエクスポートで、Javaのみのプロジェクト(エクスポート対象としてマークされている)を確認します

これで、アプリは次のようなNoClassDefFoundError例外やVFYエラーなしでビルドおよび実行されるはずです。

03-27 21:10:17.120: W/dalvikvm(420): VFY: unable to find class referenced in signature (Labstractionlayer/BaseStationManager;)
03-27 21:10:17.120: W/dalvikvm(420): VFY: unable to find class referenced in signature (Labstractionlayer/BaseStationManager;)
03-27 21:10:17.160: I/dalvikvm(420): Failed resolving Lcom/demo/log/AndroidLogWrapper; interface 253 'Lcommon/Logger/LogWrapper;'
03-27 21:10:17.160: W/dalvikvm(420): Link of class 'Lcom/demo/log/AndroidLogWrapper;' failed
03-27 21:10:17.160: E/dalvikvm(420): Could not find class 'com.demo.log.AndroidLogWrapper', referenced from method com.demo.Application.onCreate
03-27 21:10:17.160: W/dalvikvm(420): VFY: unable to resolve new-instance 218 (Lcom/demo/log/AndroidLogWrapper;) in Lcom/demo/Application;
03-27 21:10:17.170: D/dalvikvm(420): VFY: replacing opcode 0x22 at 0x0003
03-27 21:10:17.170: D/dalvikvm(420): VFY: dead code 0x0005-003c in Lcom/demo/Application;.onCreate ()V
03-27 21:10:17.170: D/AndroidRuntime(420): Shutting down VM
03-27 21:10:17.170: W/dalvikvm(420): threadid=1: thread exiting with uncaught exception (group=0x40015560)
03-27 21:10:17.180: E/AndroidRuntime(420): FATAL EXCEPTION: main
03-27 21:10:17.180: E/AndroidRuntime(420): java.lang.NoClassDefFoundError: com.demo.log.AndroidLogWrapper

ところで、ADT r17より前は、上記の手順1を実行するだけで済みました(Javaのみのプロジェクトを追加します)。ただし、r17以降では、手順2も実行する必要があります(Javaのみのプロジェクトをエクスポート用にマークします)。

于 2012-03-28T18:05:04.363 に答える
2

依存プロジェクトの名前を Android プロジェクトの .claspath ファイルに追加します。そのように:

<?xml version="1.0" encoding="UTF-8"?>
<classpath>
    <classpathentry kind="src" path="src"/>
    <classpathentry kind="src" path="gen"/>
    <classpathentry combineaccessrules="false" kind="src" path="/DependentProject1"/>
    <classpathentry combineaccessrules="false" kind="src" path="/DependentProject2"/>
    <classpathentry kind="con" path="com.android.ide.eclipse.adt.ANDROID_FRAMEWORK"/>
    <classpathentry kind="output" path="bin"/>
</classpath>
于 2012-03-11T07:38:28.877 に答える
2

私はこのスレッドを見つけましたが、実際にはうまくいきました。依存プロジェクトを確認してください

jar 依存関係を使用した Android プロジェクトのテスト

于 2012-09-14T20:24:40.757 に答える
2

私が知る限り、依存ライブラリ クラスを含む最終的な apk を ADT にエクスポートさせる唯一の方法は、すべての外部 lib.jar (あなたの他のプロジェクト) を Android プロジェクトのビルド パスに追加します。

現在のバージョンの Eclipse ADT プラグインには、非常に柔軟性のない事前定義されたビルド ライフ サイクル (特に dexing ステップ) があり、これら 3 つのタイプの Android プロジェクト (クラシック、ライブラリ、およびテスト) 以外のプロジェクト グループ化はサポートされていないようです。つまり、ADT はビルド パスの下にある通常の Java 依存プロジェクトを使用して Android プロジェクトをビルドし、依存プロジェクトによって生成された lib.jar をメイン プロジェクトのビルド パスに自動的に追加する方法を認識していません (それらを Order に追加しても)。外部 lib.jar を明示的に追加しない限り、リストをエクスポートします)。C:\workspace\game\target\game.jar と C:\workspace\engine\target\engine.jar を android-game プロジェクトのビルド パスに追加するとします。dex ファイルを生成するコマンドは次のようになります。

java [-Xmx1024M, -jar, C:\android-sdk-r16\platform-tools\lib\dx.jar, --dex, --output=C:\workspace\android-game\target\classes.dex, C:\workspace\android-game\target\classes, C:\workspace\game\target\game.jar, C:\workspace\engine\target\engine.jar]

プロジェクトのビルド ライフ サイクルを管理するためにいくつかの外部ビルド ツールを採用することを計画している場合、Maven が Android ビルド ライフ サイクルでより柔軟な構成を提供することを知っています。マルチモジュール プロジェクト (プロジェクトのグループ化) をサポートし、通常の Java プロジェクトの依存関係を適切に処理できます。

私の知識は Eclipse に基づいています。Android ソースまたは他の洗練された IDE ユーザーからのノイズを聞くことを楽しみにしています。

ADT 17.0.0 からの更新:

最新リリースの SDK r17 with ADT 17.0.0 は、このユース ケースを適切に処理すると主張しています。

Eclipse 固有の変更

「ライブラリ プロジェクト」と呼ばれる動的クラスパス コンテナは、「Android 依存関係」に名前が変更されました。これは、ライブラリ プロジェクト以外のものが含まれるようになったためです。

コンテナには、ライブラリ プロジェクトによって参照される Java のみのプロジェクトも取り込まれます。それらの Java プロジェクトが他の Java プロジェクトや jar ファイルも参照する場合、それらは自動的に追加されます (ユーザー ライブラリを介して参照される jar ファイルもサポートされます)。

重要: これは、参照元プロジェクトで参照がエクスポートされるように設定されている場合にのみ発生します。プロジェクトまたは jar ファイルをプロジェクトのビルド パスに追加する場合、これはデフォルトではないことに注意してください。ライブラリ プロジェクト (およびその libs/*.jar ファイルの内容) は常にエクスポートされます。この変更は、Java のみのプロジェクトとその独自の jar ファイルにのみ影響します。

ここでも、重複 (プロジェクトと jar ファイルの両方) が検出され、削除されます。

変更ログを確認してください。

于 2012-03-11T22:18:38.877 に答える
1

中間レベルのプロジェクトの Java ビルド パスには、下位レベルのプロジェクトが含まれていると思います。そこの下位レベルのプロジェクトを確認しましたか ([注文とエクスポート] タブ)。そうしないと、低レベルのプロジェクトの依存関係が高レベルのプロジェクトに転送されず、APK から IGame が除外され、実際に失敗がトリガーされます。

ただし、プロジェクトにリソースなどのAndroid固有のものが含まれている場合、このソリューションのAFAIKは機能しません。

于 2012-03-16T09:56:55.683 に答える
0

私はあなたとあなたのプロジェクトを疑います。私から見れば、あなたは良いデザインを持っていると思います。しかし、なぜあなたは一緒に働いているのBuild Path / Order and Exportですか?正直なところ、Eclipse を使った最初の日からそのタブに行ったことはありません。

jar ファイルをライブラリとしてインポートするには、tab Libraries-> add external Jars を使用します。

申し訳ありませんが、私はゲーム プログラミングについて詳しくありません。これは単なる提案です。あなたのエンジンが Android のサポートに適合していることを確認してください。たとえば、Android はサポートしていませんjavax.imageio。そうでない場合、アプリは外部 jar でコンパイルできますが、実行時にクラッシュする可能性があります。

于 2012-03-17T22:48:40.143 に答える