안드로이드 개발하면서 다들 한 번쯤 봤을 에러일겁니다.


java.lang.UnsatisfiedLinkError: dalvik.system.PathClassLoader 



so파일을 사용할 때 연동이 안된다고 뜨는 에러인데요.

jniLibs에 종류별로 모두 들어가있어야할 so파일이 어딘가 비어있는 데 모바일 디바이스 기종 상 so파일이 없는 곳을 참조하려고 해서 생기는 문제입니다. 이럴 때는 딱 두 부분만 추가해주면 됩니다.


gradle.properties에 가셔서 android.useDeprecatedNdk=true를 써주시고

so파일을 사용하는 프로젝트의 gradle에 가셔서 defaultConfig 안에


defaultConfig {
   ndk {
      abiFilters 'arm64-v8a', 'armeabi'
   }
}


이런 식으로 해당 so파일이 있는 폴더만 적어주시면 됩니다.


ABI 문제로 인해 디바이스 충돌 사례가 자주 발생하니 앱 개발 시 다양한 NDK를 사용한다면 지원하는 ABI를 미리 정하고 모두 통일시켜서 같은 ABI만 사용하셔야 위와 같은 안봐도 될 불필요한 에러를 발생시키지 않으니 꼭 잘 확인하고 개발하시는 것이 좋습니다.



추가 (2017.11.01) : so파일이 두 종류가 있는 데 하나는 armeabi, armeabi-v7a가 있고 하나는 armeabi, arm64-v8a가 있는 상황인 경우, 둘 다 사용하기 위해 armeabi, armeabi-v7a, arm64-v8a를 적으면 Crash가 납니다. 모두 있는 경우만 사용 가능하니 유의해주세요.


참고

해결법 https://stackoverflow.com/questions/37884769/unsatisfiedlinkerror-dalvik-system-pathclassloader

설명 https://developer.android.com/studio/projects/add-native-code.html?hl=ko

+ Recent posts