마스터Q&A 안드로이드는 안드로이드 개발자들의 질문과 답변을 위한 지식 커뮤니티 사이트입니다. 안드로이드펍에서 운영하고 있습니다. [사용법, 운영진]

UnsatisfiedLinkError 같은데요 자세히 좀 봐주세요ㅠㅠ

0 추천

현재 스트리밍으로 IP주소를 다이얼로그 창에서 입력받아서 열기 버튼을 누르면 스트리밍 동영상이 재생되도록 하는 부분에서 열기 버튼을 누를 때 아래와 같은 에러가 납니다

 01-08 00:51:45.970: E/AndroidRuntime(1320): FATAL EXCEPTION: main

01-08 00:51:45.970: E/AndroidRuntime(1320): java.lang.UnsatisfiedLinkError: Native method not found: com.example.vdplayer.LibVideo.nativeInit:()V
01-08 00:51:45.970: E/AndroidRuntime(1320): at com.example.vdplayer.LibVideo.nativeInit(Native Method)
01-08 00:51:45.970: E/AndroidRuntime(1320): at com.example.vdplayer.LibVideo.init(LibVideo.java:276)
01-08 00:51:45.970: E/AndroidRuntime(1320): at com.example.vdplayer.Util.getLibVlcInstance(Util.java:58)
01-08 00:51:45.970: E/AndroidRuntime(1320): at com.example.vdplayer.AudioService.onCreate(AudioService.java:83)
01-08 00:51:45.970: E/AndroidRuntime(1320): at android.app.ActivityThread.handleCreateService(ActivityThread.java:2697)
01-08 00:51:45.970: E/AndroidRuntime(1320): at android.app.ActivityThread.access$1700(ActivityThread.java:165)
01-08 00:51:45.970: E/AndroidRuntime(1320): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1414)
01-08 00:51:45.970: E/AndroidRuntime(1320): at android.os.Handler.dispatchMessage(Handler.java:99)
01-08 00:51:45.970: E/AndroidRuntime(1320): at android.os.Looper.loop(Looper.java:176)
01-08 00:51:45.970: E/AndroidRuntime(1320): at android.app.ActivityThread.main(ActivityThread.java:5455)
01-08 00:51:45.970: E/AndroidRuntime(1320): at java.lang.reflect.Method.invokeNative(Native Method)
01-08 00:51:45.970: E/AndroidRuntime(1320): at java.lang.reflect.Method.invoke(Method.java:525)
01-08 00:51:45.970: E/AndroidRuntime(1320): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1209)
01-08 00:51:45.970: E/AndroidRuntime(1320): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1025)
01-08 00:51:45.970: E/AndroidRuntime(1320): at dalvik.system.NativeStart.main(Native Method)
 
unsatisfiedLinkError는 대부분 경로지정이 제대로 되지 않아 발생하는 에러라고 하길래
현재 환경이 window이기 때문에 시스템 환경변수에 PATH에 jni를 이용하여 만들어낸 so파일들이  있는 libs 폴더로의 경로를 추가해 주었는데도 똑같은 에러가 납니다ㅠㅠ어떻게 고치죠?
뮤뮤 (770 포인트) 님이 2014년 1월 8일 질문

2개의 답변

0 추천
windows path는 상관없습니다.

cygwin은 설치했는지요?
커피한조각 (520 포인트) 님이 2014년 1월 8일 답변
네네 ndk build한다고 cygwin을 깔았었다가 제가 결국 build를 못해서 다른분께 so파일을 구해서 프로젝트에 libs폴더에 넣어서 run시킨 상황입니다ㅠㅠ
0 추천

unsatisfiedLinkError 의 경우 jni 심볼을 찾지 못해 나옵니다.

심볼을 찾지 못하는 이유는 다양합니다. 아래 사항을 체크해보세요.

1. libs 폴더에 so파일이 없을 때 

- 빌드시 so가 들어가도록 변경해주셔야 합니다.

2. jni 매핑 선언이 잘 못 되었을 때

 - c에서 매핑 시 패키지명이 변경되었을 때나 함수 이름 혹은 메소드가 다른지 확인 하여 수정해야 합니다.

3 c에서 jni를 등록했는데 java쪽에 매핑핑된 소스가 없을 경우

LibVideo.java 파일에 void native nativeInit(); 같은게 제대로 선언되었는지 확인해서 수정해야합니다.

4. java파일은  있으나 jni쪽 함수를 사용하기 위해  System.loadlibrary 로 so를 로드하지 않아 c쪽 함수를 찾지 못 했을 때

jni 함수 사용 전 System.loadlibrary 로 해당 so를 로드 하도록 해주셔야 합니다.

4. System.loadlibrary 자체가 실패 했을 때

- 원하는 함수가 dlopen이 되는지 확인을 해야  합니다. dlopen이 안된다면, 심볼이 빠져 있는 것으로 해당 심볼 찾아 주던지 사용하는 부분을 제거하여 dlopen이 되게 수정해주셔야 합니다.

사악미소 (65,330 포인트) 님이 2014년 1월 8일 답변
체크해 보니 마지막 경우 같은데요, 아마 심볼이 빠져있는 것으로 보입니다ㅠㅠ 이 심볼 파일들은 어떻게 찾아주는 거죠?
FATAL 에러가 나오기 전에 특정 함수를 못 찾는다고 로그로 나오니 살펴보세요.
(로그의 경우 안드로이드 버젼에 따라 안나올 수도 있습니다. 최신 버젼이 없다면 최신 애뮬에서 돌려 로그를 빼 보시는 것도 좋습니다.)
...