2011-12-20 11 views
11

私はゲームプロジェクトを非常にプラットフォームに依存しないように保ちましたので、私はという3つのプロジェクトに分割しました。 、ゲーム、アンドロイドゲーム。Eclipseの下でのAndroidアクティビティ/プロジェクト依存関係のADT

エラーに関与するクラス/インタフェースのものである:

  1. (ローレベル)エンジンプロジェクトは、このインターフェイスを定義:

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

    com.myteam.myproject.Game 
    com.myteam.myproject.MyProject (derived from com.myteam.myproject.Game) 
    
  3. (最上位)android projec tは、等:

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

すべてがうまくコンパイルして(最初の2を使用してレベル3上の別のWindowsプロジェクトで)は、Windows上で完全に実行されるアクティビティを実装しています。

しかし、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) 

Iが「ビルドの下に2つの最初のプロジェクトを追加しようとしましたPath/Order and Export "アンドロイドのゲームプロジェクトのEclipseプロジェクトの設定は他のポストやフォーラムで説明されていますが、それは事を変えません。

私の勘違いは、マニフェストやプロジェクトの設定でapkのパッケージ化や実行時にパッケージ/クラスの依存関係について別の言及が必要なことです。何か案は?

+0

.apkに見つからないクラスが含まれているかどうかを確認しましたか? – bart

+1

私はあなたとほぼ同じ正確な問題を抱えています:Javaのみのプロジェクトに依存するAndroidプロジェクト。今日まで(私はAndroid SDK Tools r17をr16から更新しました)、Project Properties-> Java Build Path-> Projectsでこの作業を行うことができました。しかし、今私は同じ例外を報告します。私はバグレポートを提出しました:http://code.google.com/p/android/issues/detail?id=27882 – jfritz42

+0

うわー、私はこの問題でナットをしていました。幸いにも、jfritz42のリンクが私に必要な答えを持っていました。 Thx男。 – tulio84z

答えて

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> 
2

は、私の知る限り、ADTは、依存ライブラリクラスで、最終的なAPKをエクスポートする唯一の方法は、明示的です外部のlib.jar(他のプロジェクトから生成されたもの)をAndroidプロジェクトのビルドパスに追加します。

現在のバージョンのEclipse ADTプラグインは、あまり柔軟性のない定義済みのビルドライフサイクル(特にデクシングステップ)を持っています.3種類のAndroid Project(クラシック、ライブラリ、テスト)以外のプロジェクトのグループ化はサポートされていません。言い換えれば、ADTは、ビルドパスの下で通常のJava依存プロジェクトを使用してAndroidプロジェクトを構築する方法を知らず、依存プロジェクトによって生成されたlib.jarをメインプロジェクトのビルドパスに自動的に追加しますエクスポートリスト)を使用して、外部lib.jarを明示的に追加しないかぎりです。 C:¥workspace¥game¥target¥game.jarとC:¥workspace¥engine¥target¥engineを追加するとします。このようなものである必要があり、あなたのAndroidゲームのプロジェクトのビルド・パスにあなたのDEXファイルを生成するには、コマンドjarファイル:あなたのプロジェクトのビルドのライフサイクルを管理するために、いくつかの外部のビルドツールを採用することを計画している場合

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から

更新:

ADT 17.0.0と最新のリリースSDKのR17は正しく、このユースケースを処理するために主張:

Eclipseの特定は

ダイナミックに変更します「ライブラリプロジェクト」と呼ばれるクラスパスコンテナは、現在はライブラリプロジェクトだけでなく、「Android Dependencies」に名前が変更されました。

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

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

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

changelogを参照してください。

1

中間レベルプロジェクトのJavaビルドパスには、低レベルプロジェクトが含まれていると思います。下位レベルのプロジェクトをチェックしましたか?(「注文とエクスポート」タブ)それ以外の場合は、低レベルプロジェクトの依存関係は、APKからIGameを除いた上位プロジェクトに転送されず、実際に障害を引き起こします。

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

0

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

ライブラリとしてjarファイルをインポートするには、タブLibraries - >外部Jarの追加を使用します。

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

12

私はほとんどちょうどあなたのように、3段のAndroid/Javaアプリケーションを持っている:

低レベルのネットワーク通信用のJava専用プロジェクト
  • のJava専用プロジェクト
    1. 抽象的な低レベルのプロジェクトの機能へ
    2. Androidアプリ

    上記の各項目は、1つのワークスペースに含まれる個別のEclipseプロジェクトです。ここで

    は、あなたがする必要があるものです:アプリケーションのプロジェクトプロパティ - > Javaの下で

    1. はPath-の構築>プロジェクト、Javaの専用アプリケーションのプロジェクトプロパティ - > Javaビルド・パスの下
    2. プロジェクトに追加 - >注文とエクスポート、(輸出のためにそれらをマーク)は、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プロジェクトをマーク)も実行する必要があります。

  • 0

    にチェックすることを確認して私のために働いたが、私はこのエラーに出くわすの新しい方法を発見しました最近の更新で他の人を助けるかもしれません。

    このエラーは、スイッチ/ケースのR.id. "定数"。最新の更新では、finalとして宣言されていてもR.java宣言がコード内で一定であるとはもはや考えられません。 .apkがコンパイルしてインストールしますが、Lcomエラーが発生します。 (Eclipseで)これを解決するには

    スイッチ宣言にカーソルを配置し、それ以外の年代場合のリストにスイッチを変換するには、Ctrl + 1を使用しています。注:ケースステートメント内にネストしたブレークがある場合、そのコードブロックを書き直す必要があります(おそらく、余分なのもの)。