기본 콘텐츠로 건너뛰기

AndroidNote - Android Studio에서 라이브러리 사용과 에러 : 방법 1



다음 지도 API을 android studio에서 외부 library로 사용하려 했지만 실행할 때 오류가 발생했다.

라이브러리 파일 추가

Android Daum Map 라이브러리는 libDaumMapAndroid.jar 와 아키텍쳐별로libMapEngineApi.so 두개의 바이너리로 구성되어 있습니다.
주어진 압축파일 libs 에 있는 파일들을 해당 프로젝트 /libs/ 로 모두 복사 해야 합니다.

AndroidManifest.xml 에 Permission 추가

<uses-permission android:name="android.permission.INTERNET">
</uses-permission>
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION">
</uses-permission>
오류 내용
01-16 10:42:01.668: E/NativeMapLibraryLoader(3427): Can`t load DaumMapEngineApi.so file
01-16 10:42:01.668: E/NativeMapLibraryLoader(3427): java.lang.UnsatisfiedLinkError: Couldn't load DaumMapEngineApi from loader dalvik.system.PathClassLoader[dexPath=/data/app/daum.net.testdaummap-5.apk,libraryPath=/data/app-lib/daum.net.testdaummap-5]: findLibrary returned null
01-16 10:42:01.668: E/NativeMapLibraryLoader(3427):  at java.lang.Runtime.loadLibrary(Runtime.java:358)
01-16 10:42:01.668: E/NativeMapLibraryLoader(3427):  at java.lang.System.loadLibrary(System.java:526)
01-16 10:42:01.668: E/NativeMapLibraryLoader(3427):  at net.daum.mf.map.n.api.NativeMapLibraryLoader.loadLibrary(NativeMapLibraryLoader.java:33)
01-16 10:42:01.668: E/NativeMapLibraryLoader(3427):  at net.daum.mf.map.n.api.NativeThread.<clinit>(NativeThread.java:6)
01-16 10:42:01.668: E/NativeMapLibraryLoader(3427):  at android.opengl.alt.GLSurfaceView.setRenderer(GLSurfaceView.java:306)
01-16 10:42:01.668: E/NativeMapLibraryLoader(3427):  at net.daum.android.map.MapView.init(MapView.java:44)
01-16 10:42:01.668: E/NativeMapLibraryLoader(3427):  at net.daum.android.map.MapView.<init>(MapView.java:56)
01-16 10:42:01.668: E/NativeMapLibraryLoader(3427):  at net.daum.mf.map.api.MapView.<init>(MapView.java:410)
01-16 10:42:01.668: E/NativeMapLibraryLoader(3427):  at java.lang.reflect.Constructor.constructNative(Native Method)
01-16 10:42:01.668: E/NativeMapLibraryLoader(3427):  at java.lang.reflect.Constructor.newInstance(Constructor.java:423)
01-16 10:42:01.668: E/NativeMapLibraryLoader(3427):  at android.view.LayoutInflater.createView(LayoutInflater.java:600)
01-16 10:42:01.668: E/NativeMapLibraryLoader(3427):  at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:702)
01-16 10:42:01.668: E/NativeMapLibraryLoader(3427):  at android.view.LayoutInflater.rInflate(LayoutInflater.java:761)
01-16 10:42:01.668: E/NativeMapLibraryLoader(3427):  at android.view.LayoutInflater.inflate(LayoutInflater.java:498)
01-16 10:42:01.668: E/NativeMapLibraryLoader(3427):  at android.view.LayoutInflater.inflate(LayoutInflater.java:398)
01-16 10:42:01.668: E/NativeMapLibraryLoader(3427):  at android.view.LayoutInflater.inflate(LayoutInflater.java:354)
01-16 10:42:01.668: E/NativeMapLibraryLoader(3427):  at com.android.internal.policy.impl.PhoneWindow.setContentView(PhoneWindow.java:359)
01-16 10:42:01.668: E/NativeMapLibraryLoader(3427):  at android.app.Activity.setContentView(Activity.java:2010)
01-16 10:42:01.668: E/NativeMapLibraryLoader(3427):  at net.daum.android.map.openapi.sampleapp.demos.SearchDemoActivity.onCreate(SearchDemoActivity.java:48)
01-16 10:42:01.668: E/NativeMapLibraryLoader(3427):  at android.app.Activity.performCreate(Activity.java:5426)
01-16 10:42:01.668: E/NativeMapLibraryLoader(3427):  at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1105)
01-16 10:42:01.668: E/NativeMapLibraryLoader(3427):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2269)
01-16 10:42:01.668: E/NativeMapLibraryLoader(3427):  at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2363)
01-16 10:42:01.668: E/NativeMapLibraryLoader(3427):  at android.app.ActivityThread.access$900(ActivityThread.java:161)
01-16 10:42:01.668: E/NativeMapLibraryLoader(3427):  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1265)
01-16 10:42:01.668: E/NativeMapLibraryLoader(3427):  at android.os.Handler.dispatchMessage(Handler.java:102)
01-16 10:42:01.668: E/NativeMapLibraryLoader(3427):  at android.os.Looper.loop(Looper.java:157)
01-16 10:42:01.668: E/NativeMapLibraryLoader(3427):  at android.app.ActivityThread.main(ActivityThread.java:5356)
01-16 10:42:01.668: E/NativeMapLibraryLoader(3427):  at java.lang.reflect.Method.invokeNative(Native Method)
01-16 10:42:01.668: E/NativeMapLibraryLoader(3427):  at java.lang.reflect.Method.invoke(Method.java:515)
01-16 10:42:01.668: E/NativeMapLibraryLoader(3427):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1265)
01-16 10:42:01.668: E/NativeMapLibraryLoader(3427):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1081)
01-16 10:42:01.668: E/NativeMapLibraryLoader(3427):  at dalvik.system.NativeStart.main(Native Method)


01-16 10:42:01.678: E/AndroidRuntime(3427): FATAL EXCEPTION: main
01-16 10:42:01.678: E/AndroidRuntime(3427): Process: daum.net.testdaummap, PID: 3427
01-16 10:42:01.678: E/AndroidRuntime(3427): java.lang.RuntimeException: Unable to start activity ComponentInfo{daum.net.testdaummap/net.daum.android.map.openapi.sampleapp.demos.SearchDemoActivity}: android.view.InflateException: Binary XML file line #32: Error inflating class net.daum.mf.map.api.MapView
01-16 10:42:01.678: E/AndroidRuntime(3427):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2305)
01-16 10:42:01.678: E/AndroidRuntime(3427):  at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2363)
01-16 10:42:01.678: E/AndroidRuntime(3427):  at android.app.ActivityThread.access$900(ActivityThread.java:161)
01-16 10:42:01.678: E/AndroidRuntime(3427):  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1265)
01-16 10:42:01.678: E/AndroidRuntime(3427):  at android.os.Handler.dispatchMessage(Handler.java:102)
01-16 10:42:01.678: E/AndroidRuntime(3427):  at android.os.Looper.loop(Looper.java:157)
01-16 10:42:01.678: E/AndroidRuntime(3427):  at android.app.ActivityThread.main(ActivityThread.java:5356)
01-16 10:42:01.678: E/AndroidRuntime(3427):  at java.lang.reflect.Method.invokeNative(Native Method)
01-16 10:42:01.678: E/AndroidRuntime(3427):  at java.lang.reflect.Method.invoke(Method.java:515)
01-16 10:42:01.678: E/AndroidRuntime(3427):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1265)
01-16 10:42:01.678: E/AndroidRuntime(3427):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1081)
01-16 10:42:01.678: E/AndroidRuntime(3427):  at dalvik.system.NativeStart.main(Native Method)
01-16 10:42:01.678: E/AndroidRuntime(3427): Caused by: android.view.InflateException: Binary XML file line #32: Error inflating class net.daum.mf.map.api.MapView
01-16 10:42:01.678: E/AndroidRuntime(3427):  at android.view.LayoutInflater.createView(LayoutInflater.java:626)
01-16 10:42:01.678: E/AndroidRuntime(3427):  at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:702)
01-16 10:42:01.678: E/AndroidRuntime(3427):  at android.view.LayoutInflater.rInflate(LayoutInflater.java:761)
01-16 10:42:01.678: E/AndroidRuntime(3427):  at android.view.LayoutInflater.inflate(LayoutInflater.java:498)
01-16 10:42:01.678: E/AndroidRuntime(3427):  at android.view.LayoutInflater.inflate(LayoutInflater.java:398)
01-16 10:42:01.678: E/AndroidRuntime(3427):  at android.view.LayoutInflater.inflate(LayoutInflater.java:354)
01-16 10:42:01.678: E/AndroidRuntime(3427):  at com.android.internal.policy.impl.PhoneWindow.setContentView(PhoneWindow.java:359)
01-16 10:42:01.678: E/AndroidRuntime(3427):  at android.app.Activity.setContentView(Activity.java:2010)
01-16 10:42:01.678: E/AndroidRuntime(3427):  at net.daum.android.map.openapi.sampleapp.demos.SearchDemoActivity.onCreate(SearchDemoActivity.java:48)
01-16 10:42:01.678: E/AndroidRuntime(3427):  at android.app.Activity.performCreate(Activity.java:5426)
01-16 10:42:01.678: E/AndroidRuntime(3427):  at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1105)
01-16 10:42:01.678: E/AndroidRuntime(3427):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2269)
01-16 10:42:01.678: E/AndroidRuntime(3427):  ... 11 more
01-16 10:42:01.678: E/AndroidRuntime(3427): Caused by: java.lang.reflect.InvocationTargetException
01-16 10:42:01.678: E/AndroidRuntime(3427):  at java.lang.reflect.Constructor.constructNative(Native Method)
01-16 10:42:01.678: E/AndroidRuntime(3427):  at java.lang.reflect.Constructor.newInstance(Constructor.java:423)
01-16 10:42:01.678: E/AndroidRuntime(3427):  at android.view.LayoutInflater.createView(LayoutInflater.java:600)
01-16 10:42:01.678: E/AndroidRuntime(3427):  ... 22 more
01-16 10:42:01.678: E/AndroidRuntime(3427): Caused by: java.lang.UnsatisfiedLinkError
01-16 10:42:01.678: E/AndroidRuntime(3427):  at net.daum.mf.map.n.api.NativeMapLibraryLoader.loadLibrary(NativeMapLibraryLoader.java:42)
01-16 10:42:01.678: E/AndroidRuntime(3427):  at net.daum.mf.map.n.api.NativeThread.<clinit>(NativeThread.java:6)
01-16 10:42:01.678: E/AndroidRuntime(3427):  at android.opengl.alt.GLSurfaceView.setRenderer(GLSurfaceView.java:306)
01-16 10:42:01.678: E/AndroidRuntime(3427):  at net.daum.android.map.MapView.init(MapView.java:44)
01-16 10:42:01.678: E/AndroidRuntime(3427):  at net.daum.android.map.MapView.<init>(MapView.java:56)
01-16 10:42:01.678: E/AndroidRuntime(3427):  at net.daum.mf.map.api.MapView.<init>(MapView.java:410)
01-16 10:42:01.678: E/AndroidRuntime(3427):  ... 25 more


그래서 구글을 6-7시간을 해멘 끝에 답을 찾았다.(OTL)

최고의 도움을 받은 링크(영어 주의)

    

일단 이런 식으로 /libs/에 다 넣어져 있는데 이 부분을 *.so 파일은 /libs/가 아니라 /lib/라는 폴더를 생성한 후 이동 시켜야 한다. 그러면 오른쪽의 화면과 같이 되는데 이 부분에서 꼭! /lib/armeabi/libDaumMapEngineApi.so 파일이 포함되게 .zip 파일로 만든 후 확장자를 .jar로 변경하고 /libs/ 폴더에 넣어 준다.

그 후에 jar 파일을 선택 후 오른쪽 클릭을 하게 되면 "Add As Library..."라고 있는데 이 부분을 클릭 해준다.


gradle 부분은 이렇게 작성하도록 한다.

그러면 제대로 library가 추가가 되었다.

정리하자면 자동을 .so 파일을 include를 안 해줘서 강제로 jar 파일로 만들어 포함시키는 것이다.

다른 사람은 이런 고통을 안 받기를 고대한다...ㅠㅠ

댓글

  1. 저 고통받는 중입니다..
    이걸로도 안되요..ㅠㅠ 살려주세요...ㅠㅠ

    답글삭제

댓글 쓰기

이 블로그의 인기 게시물

2024년 트레일러닝/마라톤 대회 연간 일정 정리

  업데이트 일자  : 2024.03.20.( 수 ) 2024 년 참여 예정인 트레일러닝 대회들을 고려 해보기 위해 글을 작성합니다. 매년 로드레이스(마라톤) 대회와 트레일러닝 대회를 같이 나가고 있는데 올해엔 뭔가 많이 하게 되네요 ㅎㅎ 트레일러닝도 작년대비 많이 생긴 것 같습니다. 개인적으로 한국의 UTMB를 꿈꾸는 장수 트레일과 태백 어셈블 대회들이 기대가 많이 되네요. 올해엔 부디 서울100K, UTNP 등 대회들의 CP(CheckPoint) 운영이 잘 되었으면 좋겠네요. 1. 트레일러닝(Trailrunning) 대회 리스트 일자 대회명 종목 장소 링크 참가여부 3 월  22 일  ~ 3 월   23 일 백야드 트레일러닝 100 Mile / 50 Mile / 30 Mile 서울시 강서구 https://cafe.naver.com/che3trailrunning/9014   4 월  5 일  ~ 7 일 제주국제트레일러닝대회 10k, 36k, 100k 제주도   https://www.jejutrail.com/ 100K  참가 4 월  6 일  ~ 7 일 장수트레일레이스 20k, 38k, 70k 장수군   https://jangsutrailrace.modoo.at/   4 월  13 일 서울울트라랠리 13K, 22K, 31K, 43K 서울 북한산 일대   http://www.xn--oi2bscs8eswnfjha816s.kr/?doc_id=schedule&wr_id=67 31K  참가 4 월  20 일 제주블랙야크트레일런 50k 제주도   https://blackyaktrailrun.blackyak.com/2024/jeju/   4 월  27 일 코리아 50K (GTNS*) 5k, 22k, 50k 동두천시   https://korea50k.com/ 50K  참가 4 월  26 일  ~ 27 일 UTMF( Ultra-Trail Mt. Fuji) 100Mile, 70km 일본(후지산)   https://mtfuji100.com/en/   5 월  11 일 금정

AndroidNote - Android Studio에서 라이브러리 사용과 에러: 방법 2

이전번에 방법 1을 소개했었다. 그 후 다음 개발자 카페에 올렸던 글에 댓글로 다른 방법을 알려줘서 그 방법을 소개하려고 합니다. 다음 지도 API을 android studio에서 외부 library로 사용하려 했지만 실행할 때 오류가 발생했었습니다. 다음 지도 API GUIDE  How To?   - 이전 동영상화면은 화질 문제로 인하여 내렸습니다. 아래 이미지 설명을 참고하여 주세요. 먼저, 압축을 풀면 위와 같이 폴더가 구성이 되어 있습니다. 그러면 아래와 같이 main 폴더에서 오른쪽 클릭한 후 [New]-[Directory]를 선택합니다.   그런 다음 jniLibs라고 폴더를 만듭니다.  그 후 두 폴더를 jniLibs 폴더 밑으로 옮깁니다.(여기에선 jar파일을 먼저 옮겼는데 이런 순서는 크게 상관이 없습니다.) 그리고 libs폴더가 기존에 있을텐데요.  이 폴더 밑으로 jar파일을 옮깁니다.  이런식으로 압축파일에 있던 파일을 추가한 후에 다음과 같이 추가합니다. <uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> 위와 같이 되어 있는 build.gradle을 아래와 같이 추가합니다. compile fileTree(dir: 'libs', include: ['*.jar']) compile files('libs/libDaumMapAndroid.jar') 마지막으로 위에 있는 메뉴 중 [sync gradle]를 클릭하여 변경한 gradle을 적용시킵니다. 그리고 사용해본 바로는 이 방법이 좀더 쉬운 편이고 편하게 할 수 있었습니