java.lang.ClassNotFoundException: nie znaleziono klasy w path: dexpathlist


140

Obecnie pracuję nad projektem, w którym muszę używać czysto natywnego ndk. Zadziałało, gdy próbuję uruchomić przykład helloworld ze źródła silnika Irrlicht. Następnie próbuję użyć go w moim projekcie, postępując zgodnie z formatem z tego przykładu. Ale dostałem:

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

podczas prowadzenia mojego projektu.

Oto mój plik 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

w 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)

I podałem nazwę działania w AndroidManifest.xml:

<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" />                     

Jaki błąd tutaj robię? W razie potrzeby prześlę pełny kod.


1
Czy używasz zewnętrznych plików jar?
Siddharth_Vyas,

@SiddharthVyas Nie, nie używam w tym zewnętrznych plików jar.
Karthik Sivam

1
Czy Twoja aplikacja jest wielodeksowa? Jeśli tak, to wyjaśnia problem.
IgorGanapolsky

kiedy zrobiłem podpisany apk, ten błąd się nie pojawił. po prostu
debuguj

Czy znalazłeś działające rozwiązanie?
Benobab

Odpowiedzi:


84

Wypróbowałem wszystkie możliwe opcje, ale wynik jest zerowy. W końcu znalazłem poprawne rozwiązanie, które jest dla mnie pomocne. Po prostu przejdź, aby wyłączyć Natychmiastowe uruchamianie Idź do Plik -> Ustawienia -> Kompilacja, Wykonanie, Wdrożenie -> Natychmiastowe uruchamianie -> Odznacz pole wyboru dla natychmiastowego uruchamiania . Uruchom aplikację raz, a ten plik APK będzie działał poprawnie.


11
To jest poprawna odpowiedź dla Android Studio. Nie mogę uwierzyć, że Instant Run nadal jest tak wadliwy, że trzeba go wyłączyć, aby uniknąć przykrych niespodzianek ...
Ognyan

2
Tej odpowiedzi szukałem od dni, a nawet tygodni! Chociaż nie jest to krytyczne, ten problem tkwił w mojej głowie, nie dając mi spokoju. Nigdy nie sądziłem, że to natychmiastowy bieg jest tym, który powoduje to. Moja aplikacja działała dobrze po uruchomieniu przez adb, ale zawsze ulegała awarii z oczekiwaniem na środowisko uruchomieniowe ClassNotFound podczas ręcznej instalacji przez apk.
Răzvan Barbu

5
To nie jest rozwiązanie dla mnie.
Wyłączyłem

Po wyłączeniu opcji. Uruchom ponownie studio z
Androidem

omg, nie wiem, dlaczego przyczyną jest natychmiastowy bieg, ale rzeczywiście tak jest, dzięki stary.
KingKongCoder

63

Miałem podobny problem, oto moje rozwiązanie:

  1. Kliknij prawym przyciskiem myszy swój projekt i wybierz Właściwości .
  2. Wybierz Ścieżkę budowania Java z menu po lewej stronie.
  3. Wybierz kartę Zamów i eksportuj .
  4. Na liście upewnij się, że biblioteki lub zewnętrzne pliki JAR, które dodałeś do projektu, są zaznaczone .
  5. Na koniec wyczyść swój projekt i uruchom.

Możesz również sprawdzić odpowiedź.


1
To jest poprawne rozwiązanie tego pytania. Przetestowałem to z moją grą libgdx z tymi samymi błędami, co powyżej. Znalazłem te błędy, korzystając z dziennika wygenerowanego na moim telefonie (Samsung Galaxy S6). Po zastosowaniu tego rozwiązania wszystkie moje problemy zostały rozwiązane.

25
Nie mogę znaleźć właściwości po kliknięciu projektu prawym przyciskiem myszy. Może jestem głupi. :(
Zin Min

12
Nie mogę też znaleźć nieruchomości, nikt nie wymyśli, jak przejść do wymienionej strony
Skyler

9
To jest rozwiązanie dla Eclipse IDE. W Android Studio nie ma domyślnego pliku „project.properties”. Można go jednak stworzyć.
Bot

Dostarczone rozwiązanie ma zastosowanie tylko do Eclipse IDE.
mnsalim

47

Wydaje się, że w twoim przypadku jest to problem. Względna ścieżka twojej aktywności w manifestacji jest nieprawidłowa:

<activity android:name="android.app.POMActivity"

zamień to na:

<activity android:name=".POMActivity"

lub

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

31

Usunięcie aplikacji na urządzeniu i czyszczenie projektu działa dla mnie


2
To zadziałało również dla mnie z React Native. Otworzyłem folder Androida w Android Studio, a następnie skompilowałem -> wyczyść projekt. Przebudowano go zreact-native run-android
pinguinos

Zrobiłem to samo, co komentarz powyżej i zadziałało! Dzięki !
Elegya

24

Powinienem zrozumieć problem, po prostu widząc

dex błędy

Ale rozwiązanie problemu zajęło pół dnia.
Naprawiam to, postępując zgodnie z instrukcją na stronie dla programistów Androida: https://developer.android.com/studio/build/multidex.html

Najpierw dodaj to do pliku gradle.build:

defaultConfig {
    ...
    minSdkVersion 14
    targetSdkVersion 21
    ...

    // Enabling multidex support.
    multiDexEnabled true
}

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

Następnie rozszerz klasę Application o MultiDexApplicationklasę zgodnie z instrukcją w powyższym linku (lub zadeklaruj klasę aplikacji w funkcji AndroidManifest.xmllub przesłoń, attachBaseContext()jeśli nie jest możliwe rozszerzenie klasy aplikacji).

To wszystko i rozwiązało problem.


1
Dodanie multi-dex jest przydatne tylko wtedy, gdy przekroczysz limit liczby odwołań (56k) i jest bardzo niestabilne i bardzo zawodne przed Lollipopem. Powinno to służyć do rozwiązywania problemów w ostateczności.
milosmns

jakie zatem według ciebie powinno być rozwiązanie
Akash Bisariya,

Mówię tylko, że multi-dex sprawia więcej kłopotów niż pomaga, co jest jasno określone na stronie programisty. Nie szukałbym tutaj odpowiedzi, gdybym ją miał, prawda?
milosmns

1
Ok, dzięki za informacje, zaktualizuj tutaj, jeśli znalazłeś dobre rozwiązanie, byłoby to bardzo pomocne.
Akash Bisariya

2
Dodanie linii w zależnościach powyżej zrobiło to za mnie.
gadildafissh

23

Po prostu wypróbuj Clean Project & Rebuild Project .


1
W menu „Kompiluj”. Wybierz Build -> Clean Projektu , a następnie Build -> Rebuild projektu
kangkyu

Oznaczałoby to, że aplikacja ulega awarii tylko lokalnie, ale awaria występuje również w wersji wydania, więc tak naprawdę nie jest to rozwiązanie.
David

22

Ten wyjątek może również wystąpić, gdy masz w układzie widok niestandardowy, taki jak ten:

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

i zmieniasz nazwę pakietu widoku z „com.example” na inną, ale zapominasz o zmianie również w układzie.


Było to pomocne z innego powodu. Sprawdź swoją pisownię. Miałem błędną nazwę klasy, która spowodowała pierwotny problem.
Berry Wing


12

rozwiązałem to za pomocą ./gradlew --stoppolecenia : w terminalu Android Studio. Po wykonaniu tego polecenia wyczyść i przebuduj projekt.


11
  1. usuń folder bin
  2. zmienić kolejność bibliotek
  3. wyczyść i odbuduj

pracował dla mnie.


10

Napisz to dla każdego, kto ma włączoną funkcję multidex

wewnątrz build.gradle

apply plugin: 'com.android.application'

android {
 defaultConfig {
      multiDexEnabled true
  }
 dexOptions {
        javaMaxHeapSize "4g"
    }
}

dependencies {
    compile 'com.android.support:appcompat-v7:+'
    compile 'com.google.android.gms:play-services:+'
    compile 'com.android.support:multidex:1.0.1'
}

napisz zajęcia EnableMultiDexjak poniżej

import android.content.Context;
import android.support.multidex.MultiDexApplication;

public class EnableMultiDex extends MultiDexApplication {
    private static EnableMultiDex enableMultiDex;
    public static Context context;

    public EnableMultiDex(){
        enableMultiDex=this;
    }

    public static EnableMultiDex getEnableMultiDexApp() {
        return enableMultiDex;
    }

    @Override
    public void onCreate() {
        super.onCreate();
        context = getApplicationContext();

    }
}

i AndroidManifest.xmlnapisz tę nazwę klasy wewnątrz tagu aplikacji

 <application
    android:name="YourPakageName.EnableMultiDex"
    android:hardwareAccelerated="true"
    android:icon="@drawable/wowio_launch_logo"
    android:label="@string/app_name"
    android:largeHeap="true"
    tools:node="replace">

Jak enableMultiDexwpływa? W moim przypadku javaMaxHeapSize "4g"nie pomogło.
CoolMind

@CoolMind To po prostu klasa aplikacji, która rozszerza MultiDexApplication. Jest to konieczne, jeśli chcesz korzystać z multidex
Manohar Reddy

Zgodzić się. I użyć jednej MultiDexApplicationlub attachBaseContext(patrz developer.android.com/studio/build/multidex ).
CoolMind

8

Wielokrotnie miałem do czynienia z tym problemem i wszystkie zostały rozwiązane przez wyłączenie funkcji Instant Run .


Próbowałem wielu rozwiązań, ta mała rzecz rozwiązała problem, niewiarygodne!
FraK

Najlepiej oceniane rozwiązanie @FraK zawiera tę poradę. Chociaż odznaczyłem już Instant Run (od kilku lat przynosi wiele błędów).
CoolMind

7

Nie musimy mieć dostosowanej klasy Application, która rozszerza MultiDexApplication . Zamiast tego możemy mieć taki plik na AndroidManifest.xml

<application
android:name="android.support.multidex.MultiDexApplication"
android:hardwareAccelerated="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:supportsRtl="true"
android:theme="@style/AppTheme">

Wraz z tym na build.gradle (moduł: aplikacja),

defaultConfig {
      ...

      // Enabling multidex support.
      multiDexEnabled true
}

dependencies {
     ... 
     compile 'com.android.support:multidex:1.0.2'
}

Dzięki.


Zmiana nazwy aplikacji zadziałała, gdy próbowałem uruchomić aplikację na
Androidzie

6

Jeśli używasz multidex, spróbuj rozszerzyć klasę aplikacji za pomocą MultiDexAppication zamiast Application i zastąp poniższą metodę, która jest wymagana dla Androida poniżej 5.0 (ponieważ 5.0 i nowsze obsługują multidex)

@Override
protected void attachBaseContext(Context base)
{
    super.attachBaseContext(base);
    MultiDex.install(BaseApplication.this);
}

iw zależnościach dodaj to

compile 'com.android.support:multidex:1.0.1'

Powinniśmy zastąpić tę metodę, jeśli rozszerzamy z Application. Dlaczego powinniśmy nadpisywać w przypadku MultiDexAppication?
CoolMind

4

Po prostu zmień nazwę folderu z libna libs,

Następnie zobaczysz kilka znaków błędów w swoim projekcie, aby rozwiązać ten problem, kliknij projekt>

Properties > Java Build Path > libraries :

Usuń całą bibliotekę z czerwonymi oznaczeniami na niej, a następnie apply > ok >po tym czystym projektu . TADA zobacz magię :)


nazwa folderu to tylko libs
Killer

4

W moim przypadku ten problem powstał z powodu Kotlina. W moim istniejącym kodzie była klasa, która została napisana Kotlin. Zbudowałem aplikację, zainstalowałem ją i zaraz po uruchomieniu pierwszej aktywności aplikacja uległa awarii. w logcat ten błąd był pokazywany. Następnie zaktualizowałem moją wersję Kotlin z witryny Kotlin w pliku gradle aplikacji. Zbuduj aplikację ponownie i wtedy działała dobrze.


Wow, mam projekt Kotlin w 99%. Co robić? :)
CoolMind

Czy możesz sprawdzić, czy wersja Kotlin jest kompatybilna z Twoim podstawowym Android Studio. To tylko przypuszczenie. spójrz
Harry .Naeem

Mam AS 3.3.1 i Kotlin 1.3.21. Są najnowsze stabilne. Przepraszam, przypuszczam, że wszystkie rozwiązania opisane powyżej i poniżej nie są odpowiednie dla mojej sytuacji.
CoolMind

4

Jedną z możliwych przyczyn może być nieprawidłowa ścieżka działania w pliku aplikacji AndroidManifest.xml. Zarejestruj aktywność w swoim AndroidManifest.xml z pełną ścieżką względną, jak poniżej.

<activity android:name="<full_path>.ActivityName" />

3

po wypróbowaniu udzielonych odpowiedzi odkryłem inny powód tego samego wyjątku, że musiałem ręcznie dodać bibliotekę, której używam do mojej głównej biblioteki za pośrednictwem

Right click on my main library > 
Properties > 
Android > 
Go to the very bottom of the screen and click (Add) > 
Select my other library that caused the crash >
Apply

przed tym rozwiązaniem użyłem "Fix Project setup" z pliku .java w eclipse, ale to nie zadziałało, więc musiałem dodać to ręcznie tutaj i zadziałało


3

Dostawałem tę awarię tylko na urządzeniach Samsung Lollipop i to rozwiązanie działało u mnie.

dexOptions {
     preDexLibraries false
}

Publikuję tę odpowiedź tutaj, ponieważ to pytanie jest obecnie najwyżej ocenianym wynikiem wyszukiwania w Google dla tej awarii i żadna z powyższych odpowiedzi nie zadziałała.


Nie pomogło mi (Samsung Galaxy S4, Android 5.0.1).
CoolMind

2

Poniższe rozwiązanie zadziałało dla mnie ...

Wypróbowałem wszystko wymienione powyżej, ale nadal nie uruchomiłem mojej aplikacji. Mam aplikację React-Native działającą na najnowszej wersji Gradle 4+ i Android Studio.

Miałem problem polegający na tym, że jeśli uruchomiłem react-native run-android, zawodził problem z informacją, że nie jest w stanie znaleźć klasy MainApplication ... tj. ClassNotFoundException

Udało mi się rozwiązać ten problem, gdy zaktualizowałem plik gradle.properties tak, aby korzystał z kompilatora D8.

Dodałem:

android.enableD8 = true

do mojego gradle.properties

Szczegóły dokumentu tutaj: https://android-developers.googleblog.com/2017/08/next-generation-dex-compiler-now-in.html


1
Android Studio 3.1+ domyślnie korzysta z tego mechanizmu zgodnego z dex
Lennon Spirlandelli,

2

Odpowiedź Ashik abbas (wyłącz Instant Run ) działa dla mnie, ale potrzebuję Instant Run , w końcu znalazłem rozwiązanie, które jest dla mnie pomocne. po prostu wyłącz minifyEnabled . przejdź do build.gradle (Module: app) w bloku debugowania i wyłącz minifyEnabled :

debug {
            minifyEnabled false

        }

1

Zgodnie z moim rozumieniem pojawia się problem po aktualizacji Android Studio 2.1 do 2.3 z powodu funkcji natychmiastowej, moja aplikacja nie będzie działać po skopiowaniu apk z wyjścia i umieszczeniu na karcie SD. W przypadku tego problemu buduję apk z opcji kompilacji, aby zbudować apk w Android Studio.


1

Jeśli jesteś włączony minifyEnabledi masz wartość shrinkResourcestrue w pliku ocen aplikacji. Musisz dodać następujący wiersz w proguard-rules.propliku

-keep class com.twoja_nazwa_pakietu. ** {*; }

ponieważ minifikacja została usunięta z naszego pliku APK.


Nie jest to dobre rozwiązanie, ponieważ wyklucza wszystkie pliki źródłowe z kurczenia się zasobów. Zamiast tego wykluczaj tylko te pliki, które są naprawdę potrzebne, w przeciwnym razie zwiększysz rozmiar pliku APK.
Yannick

1

Miałem ten problem wcześniej, a komentarze tutaj pomogły w przeszłości, ale tym razem nie. sprawdziłem konfigurację proguard i usunąłem następujące wiersze, a następnie zadziałało, więc program proguard może mieć coś wspólnego z tym błędem:

 -optimizationpasses 5
        -overloadaggressively
        -repackageclasses ''
        -allowaccessmodification
        -dontskipnonpubliclibraryclassmembers

1

W moim przypadku użyłem starej biblioteki przestrzeni nazw, podczas gdy mój projekt był skonfigurowany przy użyciu androidx one.

Rozwiązaniem było zastąpić android.support.design.widget.BottomNavigationViewskładnik z prawej jednym uciec z biblioteki wsparcia: com.google.android.material.bottomnavigation.BottomNavigationView.


1

w moim przypadku definiuję działanie w programie Manifest.xmli zapomniałem go utworzyć activity. Utworzyłem więc działanie i zdefiniowałem je w programie manifesti rozwiązałem mój błąd!



0

U mnie problem pojawił się po utworzeniu podpisanego pliku APK. Aby to naprawić, wygenerowałem nowy, debugujący apk za pomocą Run / Build APK. Następnie Run (cmd + r) działa ponownie bez tego błędu.


0

Miałem ten sam problem. Przez jeden dzień próbowałem wszystkiego, ale nic nie działało. Zależność, która powodowała problem, polegała na używaniu niższego zestawu sdk kompilacji, zestawu docelowego sdk i min sdk. Stworzyłem moduł biblioteki do projektu, skopiowałem wszystkie źródła i dopasowałem wersje sdk do wersji sdk aplikacji. I w końcu zadziałało jak urok.


0

Miałem ten sam błąd i niektóre odpowiedzi wprowadzają mnie w błąd w kwestii początkującego. Miałem niewłaściwy pakiet w moim niestandardowym deskryptorze widoku, jak poniżej. Mam nadzieję, że to komuś pomoże.

<com.my.app.wrong.package.MyActivity
    android:id="@+id/myActivity"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_marginLeft="16dp"
    android:layout_marginRight="16dp"
    android:paddingTop="16dp"
    android:paddingBottom="8dp"
    android:gravity="left" />
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.