IT_Programming/Android_NDK

[펌][에러해결법] UnsatisfiedLinkError & Gradle 3.0 프로젝트로 업데이트할 때 JNI 오류 발생 시 조치방법

JJun ™ 2018. 3. 20. 11:08



 * 출처

 : https://creaby.tistory.com/11

 : https://blog.themuser.xyz/android-gradle-3-0-프로젝트로-업데이트할-때-jni-오류-발생-시-조치/


 * 참고할만한 자료

 : https://google.github.io/android-gradle-dsl/current/com.android.build.gradle.internal.dsl.PackagingOptions.html







[에러해결법] UnsatisfiedLinkError



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



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 파일에 아래 내용을 추가합니다.




더보기


 PackagingOptions


 Properties

PropertyDescription
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.

 Methods

MethodDescription
exclude(pattern)

Adds an excluded pattern.

merge(pattern)

Adds a merge pattern.

pickFirst(pattern)

Adds a first-pick pattern.