2010-08-24 3 views
1

Nexus One, Android 2.2에서 앱을 실행할 때 이상한 문제가 발생했습니다. 내 응용 프로그램에서는 NDK로 작성된 네이티브 .so lib를 사용했습니다. Java 코드에는 2 개의 스레드가 있습니다. 하나의 UI 스레드, 네이티브 코드를 실행하는 lib, 그리고 결과 데이터로 UI를 업데이트합니다. C++ 코드에서 "myMethod"라는 특정 메서드가 호출 된 시간을 기록하고 "myMethod"가 호출 될 때마다 카운트가 하나씩 증가하는 전역 변수 "int count"가 있습니다. Nexus One에서 Android 2.2를 사용하여 앱을 실행하면 이상한 문제가 발생합니다. 내 기록에서 카운트는 1, 2, 3이고 메시지에 "08-24 12 : 32 : 57.961 : DEBUG/dalvikvm (19244) : GC_FOR_MALLOC이 (가) 267 개 개체/13712 바이트를 48ms 내에 해제했습니다"라고 표시됩니다. 이 GC_FOR_MALLOC 이벤트가 끝나면 1부터 다시 시작한 다음 2, 3, 4 ... 다시 똑같은 "myMethod"를 실행하는 두 개의 스레드가 있고 각각의 출력이 서로 섞여서 출력됩니다 무작위로 추적하십시오. 나는 안드로이드 에뮬레이터, 2.1 또는 2.2에 정확히 동일한 코드와 같은 응용 프로그램을 실행하면 예를 들어, 추적이NDK, Nexus One의 이상한 C++ 코드 문제

1, 2, 3, GC_FOR_MALLOC, 1, 2, 3, 4, 5, GC_FOR_MALLOC, 4, 5, 6, GC_FOR_MALLOC, 6, 7... 

수 있습니다 문제가 나타났다 결코 및 에뮬레이터에는 GC_FOR_MALLOC 이벤트가 없습니다.

이전에이 문제가 발생 했나요? 도움을 주셔서 감사합니다.

답변

1

변수에 volatile 키워드를 사용해보세요. http://www.drdobbs.com/184403766

언제 네이티브 클래스를 instathiate합니까? 어떤 스레드가 myMethod를 호출합니까? 그게 카운트를 읽는거야? 컴파일러 최적화 때문일 수 있습니다. 디버거 코드를 실행하는 에뮬레이터에서 왜이 문제가 보이지 않는지 설명 할 수 있습니다. 제공된 정보를 바탕으로 한 추측입니다.

+0

답장을 보내 주셔서 감사합니다. 오늘 같은 환경에서 동일한 코드를 실행할 때 문제가 발생하지 않았으며 GC_FOR_MALLOC 이벤트도 발생하지 않았습니다. dalvikvm에서 벌레처럼 보입니까? 나는 잘 모르겠다. – MaratSafinWang

1

가비지 수집기가 라이브러리를로드 한 클래스를 스윕하고있는 것처럼 들리며 이후 호출에서 다시로드되고 전역 변수가 다시 설정됩니다. 라이브러리를 어디에서로드하고 있습니까?