2014-01-22 4 views
7

우리는 네이티브 라이브러리를로드하는이 앱을 가지고 있으며이 라이브러리는 네이티브 메소드를 제공합니다. 일부 휴대 전화에서는 (특히 느린 것) 문제가 발생합니다. UnsatisfiedLinkError는 (필자가 생각하기에) 라이브러리가 여전히 "로드 중"이고 메서드가 이라고 가정 할 때마다 발생합니다.UnsatisfiedLinkError Android

이 문제를 해결할 방법이 있습니까? 라이브러리가 이미로드되었는지 확인하는 것과 같습니다.

+0

네이티브 라이브러리가로드되는 방식을 코드로 게시 할 수 있습니까? 나는 보통 정적 범위를 사용합니다. – mar3kk

+0

라이브러리는 .jar 파일에서로드됩니다. 다만, 라이브러리가 일부 전화기에서는 정상적으로로드되고 이러한 문제가 발생하지 않는다는 점을 지적하십시오. 여기에 코드가 있습니다. static { System.loadLibrary ("libraryBeingLoaded"); } – hadez30

+1

라이브러리가 실행중인 아키텍처 용으로 컴파일되어 있습니까? ARMEABI v7 버전 만 포함하고 ARMEABI 버전을 포함하지 않으면 어떻게 될까요? ARMEABI 아키텍처에서는 작동하지 않습니다. – mar3kk

답변

3

느린 장치에서도 System.loadLibrary()에 대한 호출은 매우 빠릅니다. 응용 프로그램이 멀티 스레드로 실행되거나 정적 생성자를 포함하는 클래스가 일부 UI 이벤트에 대한 응답으로 만로드되는 경우 경쟁 조건이 발생할 수 있습니다. 현재 존재하는 네이티브 라이브러리에 의존하는 일부 클래스는 충돌을 일으킬 수 있습니다.

네이티브 메소드가있는 모든 클래스에 System.loadLibrary()을 호출하는 정적 생성자를 사용할 수 없습니다. 로드 된 네이티브 라이브러리에 대한 경고가 표시 될 수 있지만 이는 부정적 결과를 초래하지 않습니다.

lib 디렉토리에 넣는 시스템 설치 프로그램 대신에 사용자 정의 Java 코드를 사용하여 처음으로 응용 프로그램을 실행할 때 기본 라이브러리를 files 디렉토리로 추출하는 경우가 있습니다. 이 작업은 특별한주의를 기울여 수행해야하며 모든 활동 (말장난 의도)은 libs (일반적으로 APK의 assets 폴더에서) 추출이 완료 될 때까지 기다려야합니다.

일부 장치의 경우 시스템 라이브러리에서 라이브러리 이름을 사용할 수 있습니다. 이 경우 System.loadLibrary()은 앱이 아닌 /system/lib에서 라이브러리를로드합니다. 그러나 이것은 3 초 지연의 효과를 거의 설명 할 수 없습니다.

+0

예, 경쟁 조건이있을 수 있습니다. 그러나 이상한 점은 UnsatisfiedLinkError가 발생하지 않았던 호출 된 원시 메소드 중 하나입니다. 그리고 다른 원시 메소드를 호출하면 UnsatifiedLinkError가 발생합니다. 그러나 세 번째 사례에 대해서는 약간의 지연이있을 경우 실행되는 것처럼 문제가되지 않는 것으로 보입니다. 내 문제는 귀하가 언급 한 첫 번째 사례로 더 많은 것을해야한다고 생각합니다. 그러나 나는 어떻게 진행해야하는지 확신 할 수 없다. 답장 보내 주셔서 감사합니다. 안녕하세요. – hadez30

+0

호출 된 네이티브 메소드 중 하나가 UnsatisfiedLinkError를 발생시키지 않았습니다.그리고 다른 네이티브 메소드를 호출하면, UnsatifiedLinkError_가 실제로이 사실을 알게됩니다. 네이티브 메소드를 호출하기 직전과 직후에 로그 메시지를 포함하는 (필터링 된)'logcat -v threadtime'을 제공하십시오. –

+0

문제는 (아직 미확인) 것으로 보이고, 두 번째 방법 (UnsatisfiedLinkErro를 유발하는 방법)이 1 일 전에 호출됩니다. 다음과 같습니다 : ApiClass.Start() - API를 시작한다고 가정합니다. ApiClass.DoSomething(). 내가 생각하는 것은 ApiClass.DoSomething()이 먼저 호출되었습니다. – hadez30