java.lang.ClassNotFoundException:在路径上找不到类:dexpathlist。

194

我目前正在处理一个项目,需要使用纯本地ndk。当我尝试从Irrlicht引擎源代码运行一个helloworld示例时,它可以工作。然后我尝试按照相同格式在我的项目中使用它。但是我遇到了以下问题:

03-14 01:40:05.308: E/AndroidRuntime(799): java.lang.RuntimeException: Unable to instantiate activity ComponentInfo{com.irrlicht.example1/android.app.POMActivity}: java.lang.ClassNotFoundException: Didn't find class "android.app.POMActivity" on path: DexPathList[[zip file "/data/app/com.irrlicht.example1-2.apk"],nativeLibraryDirectories=[/data/app-lib/com.irrlicht.example1-2, /system/lib]]

在运行我的项目时。

这是我的main.cpp文件:

#include <android/log.h>
#include <jni.h>
#include <android_native_app_glue.h>
#include "android_tools.h"
#ifdef _IRR_ANDROID_PLATFORM_
void android_main(android_app* app)
{
__android_log_print(4 , "pom" , "nothing");
}

#endif

在 Android.mk 中:

LOCAL_PATH := $(call my-dir)/..
IRRLICHT_PROJECT_PATH := $(LOCAL_PATH)
include $(CLEAR_VARS)
LOCAL_MODULE := Irrlicht
LOCAL_SRC_FILES := /home/karthik/Android/Essentials/ogl-es/lib/Android/libIrrlicht.a
include $(PREBUILT_STATIC_LIBRARY)
include $(CLEAR_VARS)
LOCAL_MODULE := HelloWorldMobile1
LOCAL_CFLAGS := -D_IRR_ANDROID_PLATFORM_ -pipe -fno-exceptions -fno-rtti -fstrict-aliasing
LOCAL_C_INCLUDES := -I ../../include -I /home/karthik/Android/Essentials/ogl-es/include -I /home/karthik/Android/json/jsoncpp-src-0.5.0/libs/linux-gcc-4.8 -I /home/karthik/Android/json/jsoncpp-src-0.5.0/include/json 
LOCAL_SRC_FILES :=  android_tools.cpp main.cpp
LOCAL_LDLIBS := -lEGL -llog -lGLESv1_CM -lGLESv2 -lz -landroid -ldl 
LOCAL_STATIC_LIBRARIES := Irrlicht android_native_app_glue
include $(BUILD_SHARED_LIBRARY)
$(call import-module,android/native_app_glue)

我在AndroidManifest.xml中给出了Activity名称:

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.irrlicht.example1"
    android:versionCode="1"
    android:versionName="1.0">
...
<application android:icon="@drawable/irr_icon" android:label="HelloWorldMobile1" android:theme="@android:style/Theme.NoTitleBar.Fullscreen" android:debuggable="true">
        <activity android:name="android.app.POMActivity"
        android:label="HelloWorldMobile1"
        android:launchMode="singleTask"
        android:configChanges="orientation|keyboardHidden"
        android:screenOrientation="portrait"
        android:clearTaskOnLaunch="true">
        <meta-data android:name="android.app.lib_name" android:value="HelloWorldMobile1" />                     

这里我犯了什么错误?如果需要,我会发布完整的代码。

1
你是否使用了任何外部的jar文件? - Siddharth_Vyas
@SiddharthVyas 不,我在这个中没有使用外部的jar文件。 - Karthik Sivam
1
你的应用程序是否已进行 multi-dex 处理?如果是,那就解释了问题所在。 - IgorGanapolsky
当我生成签名的 APK 时,没有出现这个错误。只有在调试时才会出现。 - j2emanue
你找到可行的解决方案了吗? - Benobab
在应用Gradle的调试块中,将minifyEnabled设置为false将会生效。 - Arpit Patel
45个回答

93

我尝试了所有可能的选项但结果是零。最终我找到了正确的解决方案,对我有所帮助。只需禁用即时运行,方法如下:文件 -> 设置 -> 构建、执行、部署 -> 即时运行 -> 取消即时运行的复选框。运行您的应用程序一次,此apk文件就可以正常工作。


12
这是Android Studio的正确答案。我无法相信即时运行功能仍然存在如此多的错误,以至于您必须关闭它以避免不愉快的意外... - Ognyan
2
我已经寻找这个答案好几天,甚至好几周!虽然不是很关键,但这个问题一直萦绕在我的脑海里,让我无法得到宁静。从来没有想过即时运行是导致这个问题的原因。当通过adb启动应用程序时,我的应用程序运行正常,但是当通过apk手动安装时,总是崩溃,并出现ClassNotFound运行时异常。 - Răzvan Barbu
9
对我来说,那不是解决方案。我已禁用了即时运行。 - Terranology
现在是应用更改的时候了,请参见https://android-developers.googleblog.com/2019/08/android-studio-35-project-marble-goes.html。 - AITAALI_ABDERRAHMANE
29
在现代版的Android Studio中找不到即时运行选项。 - Liker777
显示剩余7条评论

73

在您的情况下似乎存在问题。清单文件中您的活动相对路径不正确:

<activity android:name="android.app.POMActivity"
<activity android:name=".POMActivity"
或者
<activity android:name="com.irrlicht.example1.POMActivity"

在将MainActivity重构到不同的包中后,这对我来说是解决方案。 - Florian Walther

62

我曾经遇到类似的问题,以下是我的解决方法:

  1. 右键单击您的项目并选择属性
  2. 从左侧菜单中选择Java Build Path
  3. 选择Order and Export 选项卡。
  4. 确保在列表中选择了将库或外部 JAR 文件添加到您的项目中的复选框。
  5. 最后,清理您的项目并运行。

您还可以查看此答案


1
这是正确的问题解决方案。我已经使用我的libgdx游戏进行了测试,并发现与上述相同的错误。我通过使用手机(三星Galaxy S6)生成的日志找到了这些错误。一旦我应用了这个解决方案,所有的问题都得到了解决。 - user5803705
38
我右键单击项目时找不到“属性”选项,可能是我太蠢了。 :( - Zin Min
15
我也找不到属性,有人知道如何导航到列出的页面吗? - Skyler
20
这是针对Eclipse IDE的解决方案。在Android Studio中没有默认的“project.properties”文件,但可以创建该文件。 - Bot
4
提供的解决方案仅适用于Eclipse IDE。 - mnsalim
2
@Zin Min,你不是笨蛋,告诉别人“右键点击一个项目”只是糟糕的建议。右键点击哪里?在文件管理器中吗?如果Android Studio已经打开了该项目,我们需要关闭它吗? - default123

39

对于我来说,在设备上删除应用程序并清理项目是有效的


2
这个方法对我在React Native上也奏效了。我使用Android Studio打开了android文件夹,然后选择了“构建” -> “清理项目”选项。最后用react-native run-android重新构建它。 - pinguinos
和上面的评论一样做了,它起作用了!谢谢! - EldenChris

31

只需尝试清除项目重新构建项目即可。


3
在“Build”菜单下,选择“构建(Build)-> 清理项目(Clean Project)”,然后选择“构建(Build)-> 重建项目(Rebuild Project)”。 - kangkyu
这意味着应用程序仅在本地崩溃,但是崩溃也会在发布版本中发生,因此这并不是一个解决方案。 - David

27

我应该通过一眼看到就能理解问题

dex错误

但是修复这个问题花了半天时间。我遵循 Android 开发者页面上的指示来解决它: https://developer.android.com/studio/build/multidex.html

首先,在 build.gradle 文件中添加以下内容:

defaultConfig {
    ...
    minSdkVersion 15 
    targetSdkVersion 33
    // Enabling multidex support.
    multiDexEnabled true
}

 dependencies {
     compile 'com.android.support:multidex:1.0.0'

 }

然后按照上面的链接所述,使用MultiDexApplication类扩展应用程序类(或在AndroidManifest.xml中声明应用程序类,或者如果无法扩展应用程序类,则覆盖attachBaseContext()函数)。

就这样,问题就解决了。


1
只有在超过引用计数限制(56k)时,添加multi-dex才有用,并且在Lollipop之前非常不稳定和不可靠。这应该作为最后的解决问题的方法。 - milosmns
1
好的,谢谢提供信息。如果您找到了一个好的解决方案,请在这里更新,那将是非常有帮助的。 - Akash Bisariya
2
在依赖项中添加上述行对我来说起作用了。 - gadildafissh
1
完成这个步骤后,我需要清理并重新构建项目。 - Mohamed ElSawaf
1
但根据官方文档,当我们的应用程序的targetSDKVersion >= 21时,我们不需要添加multidexEnable。此外,multiDexEnable只能解决NoClassDefFoundError问题,无法解决ClassNotFoundException。 - YouCii
显示剩余2条评论

25

当你在布局中使用像这样的自定义视图时,也可能会发生此异常:

<com.example.MyView
    android:layout_width="match_parent"
    android:layout_height="match_parent" />

你将视图的包名从“com.example”更改为其他内容,但你忘记在布局中也进行更改。


2
这对于不同的原因非常有帮助。检查你的拼写。我有一个拼错的类名导致了最初的问题。 - Berry Wing

18

非常感谢您 :) - Salman Ullah Khan

15

如果现在有人遇到了这个问题,使用Android Studio 4.0+,你只需要像这里提到的那样启用Java 8即可。

android {
    defaultConfig {
            ...
    }
    compileOptions {
        sourceCompatibility JavaVersion.VERSION_1_8
        targetCompatibility JavaVersion.VERSION_1_8
    }
}

2
这对我来说花了很长时间才找到。非常感谢! - DroidClicketyClacker
1
这解决了我的问题。 - jesto paul

13

对我而言解决方案是:在Android Studio终端执行./gradlew --stop命令,之后清理并重新构建项目。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接