【问题标题】:Dex Loader Unable to execute Multiple dex files defineDex Loader 无法执行多个 dex 文件定义
【发布时间】:2011-10-07 14:41:07
【问题描述】:

好的,现在我真的被困在这里了。我不知道该做什么,去哪里或任何事情!

我一直在尝试卸载、重新安装 SDK 和 Eclipse 版本,尝试用谷歌搜索出来,但是 nu-uh... 没有!!!

我可以在模拟器中运行我的应用程序,但我无法导出它...

[2011-10-07 16:35:30 - Dex Loader] 无法执行 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;

但我不知道该怎么办...请帮助! :'(

【问题讨论】:

  • 你有没有试过直接用ant构建它,而不是通过eclipse?如果是这样,您可以发布完整的构建日志吗?另外,您是否在项目中包含任何库项目或 jar 文件?
  • 不,我没有。不,我没有其他库项目或 .jar,我只使用 Android 2.3.3,并且我在 assets 文件夹中有一个存储的数据库。这以前一直有效,但自从更新 ADT 和 Eclipse 后,这已经失败了。我还没有尝试过 Ant,我现在没有时间去做:/
  • @user889771 同样,我更新了 adt,问题开始发生
  • 在以下链接中查看我的答案。 stackoverflow.com/a/38391449/3702595

标签: android loader dex


【解决方案1】:

bin/dexedLibs 中有一个文件 libs中存在相同的文件

在库中删除它,它应该可以工作。

对我来说是 android-support-v4.jar。

希望对你有帮助

【讨论】:

  • +1,我遇到了同样的问题,你节省了我的时间,谢谢@Ahmed Zaidi
  • 当我再次运行该项目时,它会重新创建文件夹中的 jar。
  • 我不认为 libs 文件夹被编译,无论它是否在构建路径中。很好的答案。
【解决方案2】:

通过以下简单步骤修复它

  • 右键项目
  • 转到属性
  • 单击 Java 构建路径
  • 在“订购和导出”选项卡上取消选中 jar 文件和依赖项 图书馆
  • 重建项目。

【讨论】:

    【解决方案3】:
    1. 重启eclipse,
    2. 删除 bin & gen 文件夹和
    3. 最后清理项目并重新构建它。

    这对我有用.. :)

    【讨论】:

      【解决方案4】:

      我今天(2011 年 10 月 21 日)更新了 eclipse(Help->Check 更新),现在我没有看到错误。在此之前我有错误“Unable to execute dex: Multiple dex files define”。希望这会有所帮助。

      【讨论】:

      • 不!它没有帮助。对于在 Eclipse 中处理一些旧项目的我来说,这个错误仍然存​​在。
      【解决方案5】:

      问题解决了。

      在升级之前,我有 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;
      

      解决方案是在 App1 和 App2 中删除名为“Lib_src”的文件夹。

      【讨论】:

        【解决方案6】:

        Library 和 App 项目都包含相同的 DataBaseHelper.java 文件。只需将其从 App 项目中排除即可。

        【讨论】:

        • 如果我想覆盖库中的那个怎么办?
        【解决方案7】:

        当我拥有同一个库的两个副本时(我有两个不同的 Android 支持库版本 4 修订版),我遇到了这种情况。一旦我删除了其中一个 - 项目编译并且我能够运行它。 丹

        【讨论】:

        • 这对我有用....在我的项目中也有两个库具有相似的类,所以我删除了其中一个库并且一切正常......谢谢
        • 当我更新 google-play-services-lib 的支持库时,它已为我修复。
        【解决方案8】:

        哇终于...

        这个错误非常可怕。我最终所做的是下载最新版本的 Eclipse Java EE,然后将 ADT 插件安装到新的 Eclipse 中。 见Installing the Eclipse Plugin

        之后,我像往常一样配置了我的项目,并使用了此处的导出指南: Signing Your Applications

        但无论如何,我已经看到了很多答案......而实际问题极难诊断。 可能是问题在于 ADT 插件和 Eclipse IDE 之间的不兼容。 我只知道使用最新版本可以让事情顺利进行(截至 2012 年 9 月 5 日)。

        【讨论】:

          【解决方案9】:

          尝试以下步骤: 禁用“Project->Build Automatically”选项,然后“Clean”和“Build”项目,然后尝试运行。 为我工作。 可以将“自动构建”选项设置为开启

          【讨论】:

          • 这并不能解决我的问题,当我尝试运行该应用程序时问题会再次出现
          【解决方案10】:

          我还看到了“多个 dex 文件定义”消息。在阅读about some of the changes in R14 之后,我删除了项目的 bin 目录,按照上面@abbandon 的描述清理并重​​建了项目,然后重新启动了 Eclipse。这些步骤为我解决了问题。

          【讨论】:

            【解决方案11】:

            对我来说,当我遇到这个问题时,我使用的是 Android Studio,我使用的是 Google Admob 和 Analytics 外部 SDK。

            现在他们将它们与 kitkat 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>
            

            希望对你有帮助,保重..

            【讨论】:

              【解决方案12】:

              通过从 libs 文件夹中删除 3rd 方库来修复它。

              最初我尝试使用 ant 构建 ActionBarSherlock 和 MenuDrawer 的 jar,但没有成功。

              从 libs 目录中删除这些 jar 修复了该错误

              【讨论】:

                【解决方案13】:

                在我的例子中,libs 文件夹中包含两个不同的 jars 文件。

                我删除了其中一个,它解决了我的问题。

                【讨论】:

                  【解决方案14】:

                  如果您要从另一个项目导入支持 jar,则需要转到 *Java 构建路径 * 在“订购和导出”上单击支持 jar 并将其放在您的依赖项之上 重建项目。

                  【讨论】:

                    【解决方案15】:

                    在 Cordova 中,在 libs 文件夹中有一个我们在构建路径中设置的文件。我已经更新了 cordova 并更新了 jar 文件,但忘记删除 libs 文件夹中的旧 jar 文件。删除旧的,项目就像一个魅力!

                    【讨论】:

                      【解决方案16】:

                      这里的任何建议都没有为我解决这个问题。这就是我修复它的方法:

                      在第 3 行的 /proj.android/jni/Application.mk 文件中,它指定构建“mips”。我将其更改为 APP_ABI:=armeabi-v7a 以便它可以正确找到所有预构建的库。

                      【讨论】:

                        【解决方案17】:

                        移除项目中的Libs文件夹,新建Lib_src文件夹,再次导入jar。 并右键单击项目->构建路径->配置构建路径,选择Libs文件夹并单击删除,单击按钮添加文件夹->选择Lib_src->确定

                        【讨论】:

                          猜你喜欢
                          • 2014-03-14
                          • 1970-01-01
                          • 1970-01-01
                          • 1970-01-01
                          • 2013-12-03
                          • 1970-01-01
                          • 2013-01-22
                          • 2014-11-23
                          相关资源
                          最近更新 更多