2011-12-12 2 views
3

일부 Android 프로젝트 및 Eclipse에는 이상한 문제가 있습니다. 나는 모두 동일한 코드를 많이 사용하는 수많은 Android 프로젝트를 보유하고 있으므로 많은 코드를 Android 라이브러리 프로젝트로 옮겼습니다. 이것은 오랜 시간 동안 세 가지 응용 프로그램에서 잘 작동했습니다. 오늘 저는 네 번째 앱을 위해 라이브러리를 사용하고 싶었고 문제가 발생했습니다.Eclipse에서는 java.lang.NoClassDefFoundError가 있지만, Ant에서는 그렇지 않습니다.

  • 라이브러리 프로젝트 : 기본적으로, 상황은 다음과 특정 상황에서 라이브러리 프로젝트에서 활동 중 하나 인스턴스화하는 일련의 활동뿐만 아니라
  • 새로운 프로젝트가 일부 유틸리티 클래스가 포함되어 있습니다.

이것은 모두 사소한 것이어야합니다. 정확히 같은 라이브러리 프로젝트에서 정확히 동일한 활동을하는 세 가지 다른 응용 프로그램에서도 똑같은 작업을 수행했습니다. 새 프로젝트에서 프로젝트 속성에서 라이브러리 프로젝트를 참조하고 라이브러리 프로젝트의 활동을 AndroidManifest.xml에 추가했습니다. 이클립스는 이것을 인식하고,이 활동을 참조하게한다. 모든 좋은.

라이브러리 프로젝트에서 활동을 시작하는 작업을 실행할 때까지 응용 프로그램이 제대로 실행됩니다. 응용 프로그램이 종료되고 logcat이 다음과 같이 알려줍니다.

FATAL EXCEPTION: main 
java.lang.NoClassDefFoundError: no.company.application.base.SomeDetailActivity 
    at no.company.someotherapplication.SomeListActivity$4.onClick(SomeListActivity.java:466) 
    at android.view.View.performClick(View.java:2538) 
    at android.view.View$PerformClick.run(View.java:9152) 
    at android.os.Handler.handleCallback(Handler.java:587) 
    at android.os.Handler.dispatchMessage(Handler.java:92) 
    at android.os.Looper.loop(Looper.java:123) 
    at android.app.ActivityThread.main(ActivityThread.java:3691) 
    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:847) 
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:605) 
    at dalvik.system.NativeStart.main(Native Method) 

여기가 재미입니다. I 을 알고 있습니다.이 프로젝트의 유틸리티 코드가 있으므로 라이브러리 프로젝트에 .apk가 번들로 제공됩니다. 그러나 명령문 ant debug을 사용하고 나서 ant installd을 사용하여이 정확한 프로젝트를 Ant에서 컴파일 할 때, 액티비티 시작을 포함한 애플리케이션은 정상적으로 실행됩니다. 따라서 정확히 동일한 프로젝트 설정이 Ant에서는 제대로 실행되지만 Eclipse에서는 제대로 실행되지 않습니다.

나는 모든 프로젝트를 청소하고, 특정 프로젝트를 위해 .project와 .classpath를 삭제하고 재생성하는 것과 같은 내가 찾은 트릭을 시도했다. 또한 작업 목록의 매니페스트 파일과 비교하여 매니페스트 파일이 올바른지 확인했습니다. 내가 뭘하든, 나는이 문제로 다시 끝납니다. Ant로 컴파일되고 실행되면서, 프로젝트 자체에는 아무런 문제가 없지만 Eclipse를 통해 컴파일 할 수 있어야합니다.

EDIT : dexdump 도구를 사용하여 Eclipse에서 만든 apk에서 classes.dex를 디 컴파일하고 apk와 함께 번들로 제공되는지 확인할 수있었습니다. 올바른 클래스 설명자 및 인스턴스 필드가있는 클래스를 찾았습니다. 반면에, 나는 또한 앤트에 의해 생성 된 버전을 디 컴파일했고 꽤 다른 점이있다. 너무 많이 반복해야합니다. Ant와 Eclipse를 사용할 때 생성 된 파일이 동일해야합니까?

답변

0

때때로 안드로이드 플러그인은 이러한 문제를 일으키는 자원을 매우 잘 생성하지 않습니다. 간단한 절차를 따르십시오 :

  1. 레이아웃 xml 중 하나에서 일부 ID를 변경하고 xml (프로젝트에있는 모든 레이아웃)을 저장하십시오.
  2. 플러그인으로 컴파일 된 프로젝트가 ID를 변경하고 저장합니다.

문제가 발생한 경우 프로젝트를 컴파일 한 후에 문제가 해결되어야합니다.

+0

라이브러리 프로젝트에서 ID 하나를 변경했으며 라이브러리 프로젝트를 사용하는 프로젝트에서 ID 하나를 변경했지만 행운은 없습니다. 정확한 동일한 메시지와 함께 정확히 같은 줄에서 응용 프로그램이 충돌합니다. – Bendik

0

최종 프로젝트의 빌드 패스에 jar 파일을 포함하여 해결했습니다. 도서관의 buildpath는 분명히 충분하지 않았습니다.

끔찍하지만 적어도 작동합니다.

2

방금이 같은 문제가 발생했습니다. 필자의 경우 자바 빌드 경로를 제대로 설정했지만 라이브러리를 추가하는 것을 잊어 버렸다. 등록 정보 -> Android로 이동 한 다음 라이브러리 섹션에서 "추가 ..."를 클릭하고 라이브러리 프로젝트를 추가하십시오. 그 후 그것은 예상대로 달렸다.

+0

같은 문제 때문에'java.lang.VerifyError'를 보았습니다. 라이브러리 클래스는'catch' 절에서 사용 되었기 때문에 라이브러리에 대한 문제가 (메소드 호출의 경우보다) 조금 더 빨라져서 다른 예외로 명시되었습니다. – 18446744073709551615

관련 문제