2011-10-07 60 views
29

好吧,現在我真的陷入了這裏。我不知道該做什麼,去哪裏或任何事情!Dex Loader無法執行多個dex文件定義

我一直在試圖卸載,重新安裝SDK和Eclipse版本,試圖谷歌這一點,但Nu-呃...沒有!

我可以運行我的模擬器的應用程序,但我不能將其導出...

[2011-10-07十六時35分三十秒 - 地塞米松裝載機]無法執行DEX:多DEX文件定義LCOM/dreamhawk/kalori/DataBaseHelper;

這是dataBaseHelper

package com.dreamhawk.kalori; 

import java.io.FileOutputStream; 
import java.io.IOException; 
import java.io.InputStream; 
import java.io.OutputStream; 

import android.content.Context; 
import android.database.Cursor; 
import android.database.SQLException; 
import android.database.sqlite.SQLiteDatabase; 
import android.database.sqlite.SQLiteException; 
import android.database.sqlite.SQLiteOpenHelper; 
import android.util.Log; 
import android.widget.Toast; 



public class DataBaseHelper extends SQLiteOpenHelper { 

    // The Android's default system path of your application database. 
    private static String DB_PATH = "/data/data/com.dreamhawk.kalori/databases/"; 

    private static String DB_NAME = "livsmedel_db"; 
    private DataBaseHelper myDBHelper; 
    private SQLiteDatabase myDb; 

    private final Context myContext; 

    private static final String DATABASE_TABLE = "Livsmedel"; 
    public static String DB_FILEPATH = "/data/data/com.dreamhawk.kalori/databases/lifemedel_db"; 
    public static final String KEY_TITLE = "Namn"; 
    public static final String KEY_BODY = "Kcal"; 
    public static final String KEY_ROWID = "_id"; 
    private static final int DATABASE_VERSION = 2; 

    /** 
    * Constructor Takes and keeps a reference of the passed context in order to 
    * access to the application assets and resources. 
    * 
    * @param context 
    */ 
    public DataBaseHelper(Context context) { 

     super(context, DB_NAME, null, 1); 
     this.myContext = context; 

     // checking database and open it if exists 
     if (checkDataBase()) { 
      openDataBase(); 
     } else { 
      try { 
       this.getReadableDatabase(); 
       createDatabase(); 
       this.close(); 
       openDataBase(); 

      } catch (IOException e) { 
       throw new Error("Error copying database"); 
      } 
      Toast.makeText(context, "Livsmedelsdatabasen importerad", 
        Toast.LENGTH_LONG).show(); 
     } 

    } 

    private boolean checkDataBase() { 
     SQLiteDatabase checkDB = null; 
     boolean exist = false; 
     try { 
      String dbPath = DB_PATH + DB_NAME; 
      checkDB = SQLiteDatabase.openDatabase(dbPath, null, 
        SQLiteDatabase.OPEN_READONLY); 
     } catch (SQLiteException e) { 
      Log.v("db log", "database does't exist"); 
     } 

     if (checkDB != null) { 
      exist = true; 
      checkDB.close(); 
     } 
     return exist; 
    } 

    @Override 
    public void onCreate(SQLiteDatabase db) { 
     // db.execSQL(DATABASE_CREATE); 
    } 

    @Override 
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { 

      Log.w("Kalori", "Upgrading database from version " + oldVersion + " to " 
       + newVersion + ", which will destroy all old data"); 
      db.execSQL("DROP TABLE IF EXISTS Livsmedel"); 
      onCreate(db); 

     } 

    public DataBaseHelper open() throws SQLException { 
     myDBHelper = new DataBaseHelper(myContext); 
     myDb = myDBHelper.getWritableDatabase(); 
     return this; 
    } 

    public void createDatabase() throws IOException { 

     InputStream assetsDB = myContext.getAssets().open("livsmedel_db"); 
     // OutputStream dbOut = new FileOutputStream(DB_PATH); 
     String outFileName = DB_PATH + DB_NAME; 
     OutputStream dbOut = new FileOutputStream(outFileName); 

     Log.d("DH", "index=" + assetsDB); 
     byte[] buffer = new byte[1024]; 
     int length; 
     while ((length = assetsDB.read(buffer)) > 0) { 
      dbOut.write(buffer, 0, length); 
     } 

     dbOut.flush(); 
     dbOut.close(); 
     assetsDB.close(); 
    } 

    public Cursor fetchAllNotes() { 

     return myDb.query(DATABASE_TABLE, new String[] { KEY_ROWID, KEY_TITLE, 
       KEY_BODY }, null, null, null, null, null); 
    } 

    public void openDataBase() throws SQLException { 
     String dbPath = DB_PATH + DB_NAME; 
     myDb = SQLiteDatabase.openDatabase(dbPath, null, 
       SQLiteDatabase.OPEN_READWRITE); 
    } 

} 

我懷疑:

import java.io.FileOutputStream; 
import java.io.IOException; 
import java.io.InputStream; 
import java.io.OutputStream; 

但我不知道該怎麼辦......請幫助! :'(

+0

您是否嘗試過使用ant直接構建它,而不是通過eclipse來構建它? ?如果是這樣,你可以發佈完整的構建日誌嗎?另外,你是否在項目中包含任何庫項目或jar文件? – JesusFreke

+0

不,我沒有。不,我沒有其他的圖書館項目或.jars,我只使用Android 2.3.3,我有一個存儲在資產文件夾中的數據庫。這一直在工作之前,但自更新ADT和Eclipse以來,這已失敗。我還沒有試過螞蟻,現在我沒有時間去做:/ – DreamHawk

+0

@ user889771相同,我更新了adt,問題開始發生 – Rob

回答

7

我更新(更新Help->Check)日食今日(2011年10月21日),現在我沒有看到錯誤。之前,我有錯誤「Unable to execute dex: Multiple dex files define」。希望這有助於。

+0

Nop!它沒有幫助。對於我在Eclipse中處理一些舊的項目,這個錯誤仍然存​​在。 –

1

儘量遵循的步驟: 禁用‘項目 - >自動構建’選項,然後在‘清潔’和‘建設’的項目,然後嘗試運行 作品對我來說 可以設置回‘自動構建’。選項設置爲開

+0

這並不能解決這個問題,當我嘗試運行應用程序時,問題再次出現 – Rob

1

我也看到「多個dex文件定義」消息。讀取about some of the changes in R14後,我刪除了t他是我項目的bin目錄,按照上面的@abbandon所述清理和重建項目並重新啓動Eclipse。這些步驟爲我解決了問題。

8
  1. 重新啓動Eclipse,
  2. 刪除斌&根文件夾和
  3. 最後清理的項目,然後重新建立它。

這爲我工作.. :)

+0

它幫助了我。謝謝!!! – offset

2

WOW終於...

此錯誤是相當可怕的。我最終做的是下載最新版本的Eclipse Java EE,然後將ADT插件安裝到新的Eclipse中。 見Installing the Eclipse Plugin

之後,我配置我的項目像正常的,用在這裏找到了出口準則: Signing Your Applications

但不管怎麼說我見過很多答案......而實際的問題是非常難以診斷。 可能性問題在於ADT插件和Eclipse IDE之間的不兼容問題。 我只知道使用最新版本會使事情發揮作用(截至2012年9月5日)。

6

問題解決。

升級之前,我有3個Android項目:App1,App2和Lib。 Lib是一個Android庫項目,App1和App2使用它。

同時升級ADT和SDK後,我看到像

[2012-12-05 15:54:10 - Dex Loader] Unable to execute dex: Multiple dex files define Lxxx; 
[2012-12-05 15:54:10 - TrailGuide] Conversion to Dalvik format failed: Unable to execute dex: Multiple dex files define Lxxx; 

解決方案的錯誤是在這兩個應用1和App2刪除名爲「Lib_src」的文件夾。

+0

這爲我解決了它。謝謝! –

4

庫和應用程序項目都包含相同的DataBaseHelper.java文件。只是從App項目中排除它。

+0

如果我想覆蓋庫中的那個? –

57

有在箱中的文件/ dexedLibs 同樣的文件庫中存在

刪除它在庫,它應該工作。

對我來說,它是android-support-v4.jar。

希望這有助於

+1

+1,我正在經歷同樣的問題,ü節省了我的時間感謝兄弟@Ahmed Zaidi –

+0

當我再次運行項目時,它重新創建文件夾中的罐子。 – erdomester

+1

這應該是被接受的答案 – Shine

0

由libs文件夾刪除的第三方庫固定它。

最初我嘗試使用ant構建Jar的ActionBarSherlock和MenuDrawer,但它不工作。

刪除從庫目錄中的這些罐子固定的bug

0

在我的情況有兩種不同的JAR文件包含在libs文件夾中。

我已經刪除其中一個它解決了我的問題。

20

通過以下簡單步驟

固定它
  • 右擊項目
  • 轉到屬性
  • 單擊Java構建路徑
  • 在「順序和導出」選項卡中取消選中的jar文件和依賴 庫
  • 重建項目。
+0

你是對的+1 –

3

當我有同樣的lib的兩個副本(我有Android支持庫版本4的兩個不同版本)時,我碰巧遇到了這種情況。一旦我刪除了其中一個 - 編譯了該項目並且我能夠運行它。 Dan

+0

這對我有效....在我的項目中也有兩個庫有類似的類,所以我刪除了其中一個庫,並完美的工作....謝謝 – karn

+0

它是固定的我時我更新了google-play-services-lib的支持庫。 –

1

對我來說,當我遇到這個問題時,我使用的是Android Studio,我使用Google Admob和Analytics外部SDK。

現在他們正與奇巧SDK,這引起了衝突運輸他們的解決辦法是打開project.iml文件並刪除以下行:

<orderEntry type="module-library"> 
    <library> 
    <CLASSES> 
     <root url="jar://$USER_HOME$/Downloads/Ads/lib/amazon-ads-4.0.9.jar!/" /> 
    </CLASSES> 
    <JAVADOC /> 
    <SOURCES /> 
    </library> 
</orderEntry> 
<orderEntry type="module-library"> 
    <library> 
    <CLASSES> 
     <root url="jar://$USER_HOME$/Downloads/Folx/application/GoogleAdMobAdsSdk-6.2.1/Add-ons/googleanalyticsandroid/libGoogleAnalyticsV2.jar!/" /> 
    </CLASSES> 
    <JAVADOC /> 
    <SOURCES /> 
    </library> 
</orderEntry> 

希望它能幫助,照顧..

0

如果要導入從你需要去 * Java構建路徑 *在「秩序和出口」另一個項目支持jar點擊支持jar,把它放在你的依賴 重建項目上。

0

在Cordova中,在libs文件夾中有一個我們在構建路徑中設置的文件。我已更新cordova並更新jar文件,但忘記刪除libs文件夾中的舊jar文件。刪除舊的和項目像魅力工作!

0

這裏沒有任何建議爲我解決它。這是我如何修復它:

在第三行文件/proj.android/jni/Application.mk中,它指定了構建「mips」。我將其更改爲APP_ABI:= armeabi-v7a,以便它可以正確查找所有預建的庫。

0

刪除項目中的Libs文件夾,新的Lib_src文件夾,再次導入jar文件。點擊按鈕添加文件夾 - >選擇Lib_src - >確定

相關問題