2012-11-06 2 views
0
File f = new File(fullPath);    
long freeSpace = f.getFreeSpace(); 

위의 코드는 Android 앱에서 사용하고 있습니다. 내 응용 프로그램은 sdk-15 jar로 잘 컴파일됩니다. 나는 응용 프로그램을 실행API-jar에이 메소드와 구현이있는 경우 NoSuchMethodError 예외가 throw되는 이유

안드로이드 폰은 내가 getFreeSpace()에 대한 문서를 보았다 런타임

 java.lang.NoSuchMethodError: java.io.File.getFreeSpace 

에서 프로 요

나는 오류 다음 얻을

이며 API-9 이후 말한다. froyo가 API-8 (이상 나와 있습니다.)과 호환되는 것으로 알고 있습니다. 그래서 플랫폼 froyo에서이 함수를 호출 할 수는 없지만 플랫폼에서 호출 할 수는 있습니다. 위의 API-8

그래서 내 질문/모호함이 응용 프로그램을 감안할 때

완벽하게 정상적으로 컴파일, 나는 (그 기능 f.getFreeSpace 가정 것)과 그 구현은 API-15의 항아리에서 사용할 수 있습니다 내가 사용하고있는 내 응용 프로그램이 API-15의 jar 파일로 컴파일되고 항아리에 getFreeSpace() 구현이 있어야하는 이유는 무엇입니까? API-15 jar에 구현이있는 경우 플랫폼 Froyo-API-8이 문제를 일으키는 이유는 무엇입니까? ?

+0

물건의 앞부분에서 재 설계의 일환으로 손실 된 것으로 나타납니다있다 – njzk2

+0

그리고 froyo가 api 15에 대해 어떻게 알 것이라고 기대합니까? – njzk2

+0

당신은 자신의 질문에 어느 정도 답을했습니다.'getFreeSpace'가 API-9에 도입되었습니다. API-8보다 오래된 API-8에서 오류가 발생합니다. 런타임시 API 레벨이 시스템에서 사용 가능한 모든 것이기 때문에 API-15에서 컴파일 한 사실은 무의미합니다. –

답변

2

나는 (그 기능 f.getFreeSpace 가정 것)과 그 구현은 내가

을 사용하고있는 API-15의 항아리에 볼 수 있습니다 "API-15의 항아리"당신이 무슨 일이 아니다 그것이라고 생각합니다.

컴파일 할 때 컴파일하는 JAR은 이 아니며 APK의 일부분은입니다. 이 클래스는 일련의 스텁 클래스 및 메서드로, 컴파일 작업을 진행하는 데 충분합니다. 이러한 클래스 및 메서드의 실제 구현은 장치의 펌웨어에 있습니다.

내 앱이 API-15의 jar 파일로 컴파일되고 jar 파일에 getFreeSpace() 구현이 있어야하는 이유는 무엇입니까?

컴파일 타일 JAR을 사용하여 컴파일 할 때 getFreeSpace()이 있습니다. 해당 메소드가 Android 버전에 없기 때문에 API 레벨 8 장치에서 런타임에 getFreeSpace()을 가질 수 없습니다.

구현이 API-15 병에있는 경우 플랫폼 Froyo-API-8에서 문제가 발생하는 이유는 무엇입니까? ?

"API-15 jar"는 컴파일 타임에만 사용되며 런타임에서는 사용되지 않습니다.

는 항상 api8에, 그 이유있는 안드로이드 개발자 사이트에 이에 대한 자세한 자료로 사용하지만, api15에서 2012 년

+0

감사합니다 CommonsWare, 그래서 만약 이러한 api - sdk 항아리는 단지 컴파일을위한 단순한 빈 스텁입니다, 그것이 어떤 api - 항아리 내가 링크로 모든 차이를 만들지 않습니다 가정합니다 ~에? 최신 버전을 구해서 연결하십시오 (함수의 상위 집합 임)? - 타겟 Plaform (s)에 대해 지원되지 않는 기능을 호출하지 않는 한 – Ahmed

+0

@Ahmed : "내가 링크하는 API 병에 대해 전혀 변화가 없다고 가정하는 것이 맞습니까?" - 런타임에 직접 호출하려는 모든 클래스와 메소드를 포함하는 API 레벨에 대해 컴파일해야합니다. "내 타겟 Plaform (s)에 대해 지원되지 않는 기능을 호출하지 않는 한"- 정확합니다. 'android.os.Build'를 사용하여 실행중인 장치의 버전을 알 수 있으므로 안전하다고 판단되는 장치에서 조건 적으로 새로운 메서드를 호출 할 수 있습니다. – CommonsWare

+0

감사합니다 CommonsWare,이 도움이되었고 내 마음에서 중요한 오해를 해결. 게시하기 전에 안드로이드 워드 프로세서를 찾으려고했지만 명확한 관련 정보를 찾을 수 없었습니다. 내 질문에 대한 답변이 충분하지만이 주제에 대해 자세히 이해하고 싶습니다. 어떤 기사/참조 자료를 공유 할 수 있다면 고맙습니다. 다시 한번 감사합니다 – Ahmed

관련 문제