developer tip

Android의 Java 라이브러리에있는 코드에 대한 NoClassDefFoundError

optionbox 2020. 10. 18. 09:20
반응형

Android의 Java 라이브러리에있는 코드에 대한 NoClassDefFoundError


내 사용자들 사이에서 자주 오류가 발생합니다. 시작하는 동안 앱이 충돌합니다. MainActivity가로드되어야 할 때 VM은 분명히 클래스를 찾을 수 없습니다. 이유를 알 수 없습니다. 앱의 아키텍처는 내 무료 버전과 프로 버전이 모두 사용하는 공통 프로젝트가 있다는 것입니다. 관련성이 있는지 모르겠습니다. 아래 스택 추적을 참조하십시오. 이견있는 사람?

java.lang.NoClassDefFoundError: com.android.common.MainActivity
at com.mycompany.myapp.Splash.onCreate(Splash.java:23)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1615)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1667)
at android.app.ActivityThread.access$1500(ActivityThread.java:117)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:935)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:130)
at android.app.ActivityThread.main(ActivityThread.java:3687)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:507)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:842)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:600)
at dalvik.system.NativeStart.main(Native Method)
Caused by: java.lang.ClassNotFoundException: com.android.common.MainActivity in loader     dalvik.system.PathClassLoader[/system/framework/com.google.android.maps.jar:/data/app/com.android.pro-1.apk]

편집 : Richard, 아래 의견에 감사드립니다. 이제 나는 com.android.Splash다른 것으로 바뀌 었 습니다. 어쨌든 실제 클래스 이름이 아니 었습니다. 내 잘못이야...!


나는 같은 문제가 있었고 문제를 해결하기 위해 다음을 수행했습니다.

  1. 프로젝트의 "속성"으로 이동합니다.
  2. "Java 빌드 경로"를 선택하십시오.
  3. "주문 및 내보내기"탭 선택
  4. 여기에서 선택한 프로젝트의 "src"및 "gen"경로와 종속성을 볼 수 있습니다.
  5. 나열된 순서는 먼저 "src"와 "gen"경로였습니다.
  6. "gen"폴더가 "src"이전에 빌드되도록 전환합니다.

gen- 프로젝트의 자동화 된 코드 (종속성 및 참조에서)
src- 프로젝트의 소스 코드

Eclipse를 다시 시작할 필요가 없습니다. 방금 작동하기 시작했습니다.

솔직히 "안드로이드 도구> 프로젝트 속성 수정"을 시도한 적이 없으며 때로는 같은 일을 할 수도 있습니다. 모르겠습니다. 빌드 경로에 문제가 있다고 생각하면서 오류 메시지를 본 후 방금 위의 작업을 수행했습니다.


편집하다


나중에 충분하지 않아서 다시 오류가 발생했습니다. 그런 다음 해당 뷰에 나열된 모든 종속성을 "확인"했습니다. 이제 다시 작동합니다. 여태까지는 그런대로 잘됐다. 다시 실패하면 계속 업데이트하겠습니다.

참고 : 마지막 시도에서 "Android 도구> 프로젝트 속성 수정"을 시도했지만 제대로 작동하지 않았습니다.


현재 SDK 20.0.3을 사용하고 있으며 이전 솔루션 중 어느 것도 저에게 효과가 없었습니다.

나는 일을 할 수 있었다.

  • Android 프로젝트를 마우스 오른쪽 버튼으로 클릭
  • 그런 다음 빌드 경로-> 링크 소스를 선택하여 링크 소스 대화 상자를 표시하십시오.
  • 그런 다음 Java 프로젝트의 'src'폴더를 지정하고 기본값 인 'src'(예 : 'src2')가 아닌 다른 이름을 지정했습니다.
  • 이제 오른쪽 클릭-> 새 'src2'폴더를 삭제할 수 있습니다.

This brought this created Java class files that were compiled for the Dalvik VM instead of the Java VM when the Android project was built. This allowed the Java class files in the Android Library jar file to go thru dexing when the Android project .apk was created. Now when the app was run the Java project classes were found instead of a Java.lang.NoClassDefFoundError being thrown.

소스를 연결하는 대신 jar 파일을 사용하려면 Library Android 프로젝트를 만들어야합니다. (속성-> Android에서 'is library'가 선택된 Android 프로젝트.) 그런 다음 위에서 설명한대로 Java 프로젝트의 소스를 Android Library 프로젝트에 연결하거나의 'src'폴더에서 소스 파일을 복사해야합니다. Java 프로젝트를 Android 라이브러리 프로젝트의 'src'폴더에 추가합니다. Android 라이브러리 프로젝트를 빌드하십시오. 그러면 생성 된 Android 프로젝트 jar 파일을 Android 폴더의 'libs'폴더에 복사 할 수 있습니다. 그 안에있는 클래스 파일은 Android 프로젝트가 빌드 될 때 Java VM 대신 Davlik VM 용으로 컴파일 되었기 때문입니다. 이렇게하면 Android 프로젝트 .apk가 생성 될 때 Android 라이브러리 jar 파일의 Java 클래스 파일이 dexing을 통과 할 수 있습니다.


프로젝트-> 속성-> Java 빌드 경로-> 주문 및 내보내기로 이동하여 프로젝트 및 사용중인 다른 모든 라이브러리 프로젝트에 대해 Android Private Libraries가 확인되었는지 확인합니다. 아래 링크 NoClassDefFoundError Android Project를 따라 솔루션을 얻었습니다 .


누군가에게 도움이 될 경우에도 같은 문제에 직면했습니다. 내 jar 파일은 libs 디렉토리에 있었고 jar는 빌드 경로에 추가되었습니다. 여전히 예외가 발생했습니다.

나는 방금 프로젝트를 청소했고 그것은 나를 위해 일했습니다.

Eclipse-> 프로젝트-> 정리-> 프로젝트를 선택하고 정리


위의 모든 솔루션을 시도했지만 해결되지 않았습니다. 프로젝트-> 구성 빌드 경로-> 주문 및 내보내기-> 종속 프로젝트를 맨 위로 이동하기 위해 수행 한 작업은 다음과 같습니다.


이 오류는 Google API (예 :지도)를 사용하는 앱을 만들지 만 Android API를 대상으로하는 기기에서 실행하는 경우에도 생성됩니다.


java.nio.charset.StandardCharsets를 사용할 때이 NoClassDefFoundError가 발생했습니다.

그 이유는 JRE 1.7까지 StandardCharsets가 존재하지 않았기 때문입니다. 자바 컴파일 버전을 1.7로 설정하면 이클립스는 "안드로이드는 컴파일러 컴플라이언스 레벨 5.0 또는 6.0이 필요하다"고 불평했습니다. 그래서 프로젝트 이름-> Android 도구-> 프로젝트 속성 수정을 마우스 오른쪽 버튼으로 클릭하여 수정했습니다. JRE1.6으로 컴파일됩니다.

그러나 StandardCharsets는 1.7까지 존재하지 않았기 때문입니다. 실행했을 때 NoClassDefFoundError를보고했습니다.

JDK를 다시 설치하는 것을 포함한 많은 다른 방법을 시도 할 때까지 이것을 깨닫지 못했습니다. 실제 이유는 NoClassDefFoundError의 의미로 명확하게 알 수 있습니다. 컴파일을 통과했지만 런타임에 클래스를 찾을 수 없습니다.

일반적인 결론은 Android가 JRE 1.7에서 작동하지 않는 한 1.7 이후 제공된 새로운 기능을 사용하면이 오류가 발생한다는 것입니다.

내 해결책은 그 소스 코드를 내 코드에 복사하는 것입니다!


NoClassDefFoundError 설명은 SO 태그에서 다음과 같습니다.

The Java Error thrown if the Java Virtual Machine or a ClassLoader instance tries to load in the definition of a class (as part of a normal method call or as part of creating a new instance using the new expression) and no definition of the class could be found. The searched-for class definition existed when the currently executing class was compiled, but the definition can no longer be found.

Or better:

NoClassDefFoundError in Java comes when Java Virtual Machine is not able to find a particular class at runtime which was available during compile time.

from this page. Check it, there are some ways to solve the error. I hope it helps.


In my case, I was trying to add a normal java class (from a normal java project) compiled with jre 1.7 to an android app project compiled with jre 1.7.

The solution was to recompile that normal java class with jre 1.6 and add references to the android app project (compiled with jre 1.6 also) as usual (in tab order and export be sure to check the class, project, etc).

The same process, when using an android library to reference external normal java classes.

Don't know what's wrong with jre 1.7, when compiling normal java classes from a normal java project and try to reference them in android app or android library projects.

If you don't use normal java classes (from a normal java project) you don't need to downgrade to jre 1.6.


For me this problem was related to the API that I was using not being deployed. For example, I used a ZSDK_API.jar as a reference.

To fix the issue I had to right click on the project and select properties. From JAVA BUILD PATH, I had to add the API that was not being deployed. This was weird as the app was throwing MainActivity class not found and in reality the error was caused by the DiscoveryHandler class not being found.

Hopes this helps someone.


I met NoClassDefFoundError for a class that exists in my project (not a library class). The class exists but i got NoClassDefFoundError. In my case, the problem was multidex support. The problem and solution is here: Android Multidex and support libraries

You get this error for Android versions lower than 5.0.


On Android Studio:

1) Add multiDexEnabled = true in your default Config

2) Add compile com.android.support:multidex:1.0.0 in your dependencies

3) Application class extend MultiDexApplication instead of just Application


Other idea. For example, you have class derived from "android.support.v4.app.Fragment".

However you made a mistake and inherited it from "android.app.Fragment". Then you will have this error on the Android 2 devices.


I have just figured out something with this error.

Just make sure that the library jar file contains the compiled R class under android.support.v7.appcompat package and copy all the res in the v7 appcompat support "project" in your ANDROID_SDK_HOME/extras/android/support/v7/appcompat folder.

I use Netbeans with the Android plugin and this solved my issue.


I am guessing that you don't specify javac's target when creating the common library, so javac automatically uses the latest available target, which is likely 1.7 (Java7) or 1.8 (Java8).

It has already been stated that

Android requires compiler compliance level 5.0 or 6.0

dx of Android's build tools < 19.0.0 isn't able to convert Java7 (or higher) bytecode to Dalvik bytecode.

So either use a build tools version >= 19.0.0 or use javac with -target 6, by modifying for example your ant build.xml like this:

<javac
srcdir="src/"
destdir="build/"
target="6"
/>

I fixed this issue by adding library project path in project.propertied manually. some how eclipse did not added this entry automaticvally along with "add project". so the point where app was trying to refer any componenrt inside lib project it was crashing .

you also can try the same thing . app dependecy in projec.properties like

android.library.reference.1=....\android-sdks\extras\google\google_play_services\libproject/google-play-services_lib

and run .


jars used to be in the lib/ folder, now they're in libs/ If you use lib, you can move your jars from lib to libs, and remove the dependencies from project properties/java build path because Android will now find them automatically.


For me, the issue was that the referenced library was built using java 7. I solved this by rebuilding using the 1.6 JDK.


Some time java.lang.NoClassDefFoundError: error appear when use ART instead of Dalvik runtime. To change runtime just go to Developer Option -> Select Runtime -> Dalvik.


If none of the above works (like it happened to me), and you're using as a library another project in Eclipse.

Do so: Right click project -> Properties -> Android -> Library -> Add

That did it for me! Adding a project as a library (Project Properties)


Activity again added to manifest.I tried in my manifest then app worked.

 <activity
        android:name="com.xxx.xxx.MainActivity"

Try go to

  • Right click project
  • Java build path
  • Source
  • right side -> Add folder button
  • selected libs folder and OK

I hope it helps.


Solutions:

  1. List item
  2. Check Exports Order
  3. Enable Multi Dex
  4. Check api level of views in layout. I faced same problem with searchView. I have check api level while adding searchview but added implements SearchView.OnQueryTextListener to class file.

1)In Manifest file mention your activity name and action for it and also category . 2)In your Activity mention your starting contentview and mention your view id's in the activity.

참고URL : https://stackoverflow.com/questions/8678630/noclassdeffounderror-for-code-in-an-java-library-on-android

반응형