* 출처
: https://creaby.tistory.com/11
: https://blog.themuser.xyz/android-gradle-3-0-프로젝트로-업데이트할-때-jni-오류-발생-시-조치/
* 참고할만한 자료
안드로이드 개발하면서 다들 한 번쯤 봤을 에러일겁니다.
java.lang.UnsatisfiedLinkError: dalvik.system.PathClassLoader |
so파일을 사용할 때 연동이 안된다고 뜨는 에러인데요.
jniLibs에 종류별로 모두 들어가있어야할 so파일이 어딘가 비어있는데 모바일 디바이스 기종 상 so파일이 없는 곳을
참조하려고 해서 생기는 문제입니다. 이럴 때는 딱 두 부분만 추가해주면 됩니다.
gradle.properties에 가셔서 android.useDeprecatedNdk=true를 써주시고
so파일을 사용하는 프로젝트의 gradle에 가셔서 defaultConfig 안에
1 2 3 4 5 | 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
[Android] Gradle 3.0 프로젝트로 업데이트할 때 JNI 오류 발생 시 조치방법
기존의 안드로이드 프로젝트가 2.x 버전대였는데 이 때문에 Java 8을 사용하지 못하고 있었습니다.
Jack Compiler를 사용하면 안되는 것도 아니지만, 프로젝트 내부적으로 적용해 둔 난독화 모듈이 Jack Compiler를 지원하지 않아서 적용을 못하고 있었습니다.
그런데 Android Studio 3.0으로 업그레이드가 되면서 Gradle 3 사용시 Jack Compiler 없이도 Java 8을 사용할 수 있게 되었다고 합니다. Gradle 3으로 올리는 순간 여러가지 수정을 해 주어야 하는데 그 중에서도 JNI 관련한 오류가 있어서 소개할까 합니다.
오류메시지:
해결방법: app 모듈의 build.gradle 파일에 아래 내용을 추가합니다.
1 2 3 4 5 6 7 | andorid { packagingOptions { pickFirst 'lib/arm64-v8a/*' pickFirst 'lib/armeabi-v7a/*' } } |
PackagingOptions
Properties
Property | Description |
doNotStrip | The list of patterns for native library that should not be stripped of debug symbols. |
excludes | The list of excluded paths. |
merges | The list of patterns where all occurrences are concatenated and packaged in the APK. |
pickFirsts | The list of patterns where the first occurrence is packaged in the APK. First pick patterns do get packaged in the APK, but only the first occurrence found gets packaged. |
'IT_Programming > Android_NDK' 카테고리의 다른 글
[펌][안드로이드] 2019년 8월부터 구글 플레이에 올라가는 앱 64비트 대응하기 | Android 64비트 대응하기 - ARM , X86, MIPS (0) | 2019.02.15 |
---|---|
[펌] 안드로이드 NDK (Native Development Kit) r14 를 소개합니다. (0) | 2017.04.28 |
[펌][AndroidStudio] NDK - C 및 C++ 코드를 프로젝트에 추가 (0) | 2016.09.02 |
NDK 라이브러리 배포 시 java.lang.UnsatisfiedLinkError 에 대해서... (0) | 2016.05.10 |
[펌] 안드로이드의 ABI 관리 (0) | 2016.03.16 |