2011-12-20 30 views
11

我試圖保持一個遊戲項目相當獨立的平臺Android的活動,所以我把它分解成三個項目從低級別到最高的Android特定級別這樣:發動機,遊戲,安卓遊戲。下與項目相關的Eclipse/ADT(未能解決XY)

的參與類/錯誤的接口可:

  1. (低電平)發動機項目定義了這個接口:

    com.myteam.engine.IGame 
    
  2. (級別MID)平臺的獨立遊戲項目定義的類別:

    com.myteam.myproject.Game 
    com.myteam.myproject.MyProject (derived from com.myteam.myproject.Game) 
    
  3. (頂層)android projec牛逼實現活動等:

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

所有編譯好,在Windows下運行非常好(在第3級別的其他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) 

我試着下了「建設將兩個首批項目路徑/順序和導出「安卓遊戲項目的Eclipse項目設置,如其他帖子和論壇中所述,但它不會改變任何事情。

我的預感是Manifest或Project設置需要另外提及apk包或運行時的包/類依賴關係。有任何想法嗎?

+0

您是否檢查過.apk是否包含未找到的類? – bart 2011-12-20 20:49:36

+1

我和你有幾乎完全相同的問題:一個依賴純Java項目的Android項目。直到今天(當我從r16更新到Android SDK Tools r17時),我可以使用Project Properties-> Java Build Path-> Projects來完成這項工作。但現在我得到了你所報告的同樣例外。我提交了一個錯誤報告:http://code.google.com/p/android/issues/detail?id=27882 – jfritz42 2012-03-27 22:05:08

+0

哇,我瘋了這個問題。幸運的是jfritz42的鏈接有我需要的答案。 Thx男人。 – tulio84z 2012-05-27 13:27:46

回答

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插件具有非常不靈活的預定義構建生命週期(特別是在dexing步驟中),顯然它不支持除這三種類型的Android項目以外的項目組合(經典,庫和測試)。換句話說,ADT不知道如何使用構建路徑下的常規Java依賴項目來構建Android項目,並自動將依賴項目生成的lib.jar添加到主項目的構建路徑中(即使將它們添加到Order和「導出」列表),除非您明確將外部lib.jar添加到其中。假設您添加了C:\ workspace \ game \ target \ game.jar和C:\ workspace \ engine \ target \ engine。罐子到你的Android遊戲項目的構建路徑,命令生成您的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

更新:

與ADT 17.0.0最新版本的SDK R17聲稱現在妥善處理這個用例:

Eclipse的具體變化

動態名爲「Library Projects」的類路徑容器已重命名爲「Android Dependencies」,因爲它現在不僅僅包含Library項目。

該容器現在還將填充庫項目引用的僅Java項目。如果這些Java項目也引用其他Java項目和/或jar文件,它們將自動添加(也支持通過用戶庫引用的jar文件)。

重要提示:只有在引用設置爲在引用項目中導出時纔會發生這種情況。請注意,在將項目或jar文件添加到項目構建路徑時,這不是默認設置。 圖書館項目(及其libs/*。jar文件的內容)始終導出。此更改僅影響純Java項目和他們自己的jar文件。

再次檢測並刪除重複項目(項目和jar文件)。

查看changelog

1

我猜,中級項目的Java Build路徑包含低級項目。您是否檢查過那裏的低級項目(標籤「訂單和導出」)?否則,低級別項目依賴關係不會轉發到高級項目,但不包括實際觸發失敗的APK中的IGame。

但是,如果您的項目包含特定於Android的資源等資源,此解決方案AFAIK將無法工作。

0

我懷疑你和你的項目。從我的角度來看,我看到你有一個很好的設計。但是你爲什麼使用Build Path/Order and Export?老實說,我從從事Eclipse工作的第一天就沒有去過這個標籤。

要將jar文件導入爲庫,使用標籤Libraries - >添加外部Jars。

我很抱歉我不知道遊戲編程,這只是一個建議:確保您的引擎適合Android支持的內容。例如,Android不支持javax.imageio。如果沒有,應用程序可以使用外部jar編譯,但可以在運行時崩潰。

12

我有一個三層的Android/Java應用程序,幾乎就像你:

  1. Java的僅適用於低級別的網絡通信項目
  2. 純Java的抽象低級別項目的特點
  3. 項目
  4. 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項目)。

0

我知道這是一個老問題,但我發現過這個錯誤即將到來的新方法,其可以幫助其他人最近的更新。

我從使用開關/案例陳述了R.id. 「常量」。最新的更新不再將R.java聲明視爲代碼中的常量,即使它們被聲明爲final。會發生什麼是.apk將編譯和安裝,但會產生這些Lcom錯誤。

爲了解決這個問題(在Eclipse)就是把光標放在開關聲明並使用Ctrl + 1,如果然後其他年代到開關轉換的列表。請注意,如果在的情況下聲明中有嵌套中斷,則需要重新編寫該代碼塊(可能需要額外的或其他's)。

相關問題