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

마시멜로에서 speex 코덱 관련 질문드립니다.

0 추천

현재 어플에서 speex 코덱을 jni를 이용하여 사용하고 있습니다.

ndk로 빌드해서 *.so 파일로 만들어서 잘 사용하고 있는데

마시멜로 버전에서 사용할 때 *.so 파일을 인식하지 못하는 것 같습니다.

에러메시지는 아래와 같습니다.

 

W/System.err: java.lang.UnsatisfiedLinkError: dlopen failed: cannot locate symbol "__aeabi_memmove" referenced by "/data/app/com.modemgate.accesc-1/lib/arm/libspeex_jni.so"...
W/System.err:     at java.lang.Runtime.load(Runtime.java:332)
W/System.err:     at java.lang.System.load(System.java:1069)
W/System.err:     at com.modemgate.accesc.activity.RequestVoiceActivity.LoadLibrary(RequestVoiceActivity.java:88)
W/System.err:     at com.modemgate.accesc.activity.RequestVoiceActivity.onCreate(RequestVoiceActivity.java:145)
W/System.err:     at android.app.Activity.performCreate(Activity.java:6904)
W/System.err:     at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1136)
W/System.err:     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3267)
W/System.err:     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3416)
W/System.err:     at android.app.ActivityThread.access$1100(ActivityThread.java:229)
W/System.err:     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1821)
W/System.err:     at android.os.Handler.dispatchMessage(Handler.java:102)
W/System.err:     at android.os.Looper.loop(Looper.java:148)
W/System.err:     at android.app.ActivityThread.main(ActivityThread.java:7407)
W/System.err:     at java.lang.reflect.Method.invoke(Native Method)
W/System.err:     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1230)
W/System.err:     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1120)
V/MediaPlayer-JNI: stop
V/MediaPlayer: stop
D/ContentValues: bufferSize:640
I/qtaguid: Untagging socket 101
I/qtaguid: Untagging socket 95

           [ 03-29 16:40:17.812  2439:16845 I/         ]
           ServiceUtilities : uid = 10245, checkedOpPackageName = com.modemgate.accesc
E/art: No implementation found for int com.modemgate.accesc.activity.RequestVoiceActivity.Speex_open(int) (tried Java_com_modemgate_accesc_activity_RequestVoiceActivity_Speex_1open and Java_com_modemgate_accesc_activity_RequestVoiceActivity_Speex_1open__I)
E/AndroidRuntime: FATAL EXCEPTION: AudioRecorder Thread
                  Process: com.modemgate.accesc, PID: 3085
                  java.lang.UnsatisfiedLinkError: No implementation found for int com.modemgate.accesc.activity.RequestVoiceActivity.Speex_open(int) (tried Java_com_modemgate_accesc_activity_RequestVoiceActivity_Speex_1open and Java_com_modemgate_accesc_activity_RequestVoiceActivity_Speex_1open__I)
                      at com.modemgate.accesc.activity.RequestVoiceActivity.Speex_open(Native Method)
                      at com.modemgate.accesc.activity.RequestVoiceActivity.writeAudioDataToFile(RequestVoiceActivity.java:299)
                      at com.modemgate.accesc.activity.RequestVoiceActivity.access$500(RequestVoiceActivity.java:68)
                      at com.modemgate.accesc.activity.RequestVoiceActivity$2.run(RequestVoiceActivity.java:390)
                      at java.lang.Thread.run(Thread.java:818)

 

 

UnsatisfiedLinkError 를 검색해서 문제를 해결해보려고 했는데 아직까지 해결을 못했습니다.

에러 메시지 상으로는 *.so 파일을 인식하지 못하는 것 같은데 원인을 모르겠습니다.

뭐가 문제일까요?...

다타잰 (120 포인트) 님이 2017년 3월 29일 질문

2개의 답변

0 추천

http://stackoverflow.com/questions/32885533/android-6-0-preview-3-device-with-target-sdk-23-system-loadlibrary-is-fail

add -fpic or -fPIC to your LOCAL_CFLAGS in your Android.mk file, and then rebuild the libraries.

 

https://developer.android.com/about/versions/marshmallow/android-6.0-changes.html?hl=ko#behavior-runtime

이제 dlopen(3) RTLD_LOCAL 플래그가 올바로 구현되었습니다. RTLD_LOCAL이 기본값이므로 RTLD_LOCAL을 명시적으로 사용하지 않는 dlopen(3)에 대한 호출은 영향을 받을 수 있다는 점을 유의하세요(단, 앱이 명시적으로 RTLD_GLOBAL을 사용한 경우는 예외). RTLD_LOCAL의 경우, 나중에 dlopen(3) 호출로 로드되는 라이브러리에서는 기호를 이용할 수 없게 됩니다(DT_NEEDED 항목에 의해 참조되는 것과는 반대).

 

Android의 이전 버전에서 앱이 시스템에 텍스트 재배치와 함께 공유 라이브러리를 로드하도록 요청하면 시스템은 경고를 표시하되 라이브러리 로드는 허용했습니다. 이 릴리스부터 앱이 SDK 버전 23 이상을 대상으로 하면 시스템이 이 라이브러리를 거부합니다. 라이브러리 로드가 실패했는지 확인할 수 있도록 앱은 dlopen(3) 실패를 기록하고 dlerror(3) 호출이 반환하는 문제 설명 텍스트를 포함합니다. 텍스트 재배치 처리에 관한 자세한 정보는 이 가이드를 참조하세요.

aucd29 (218,390 포인트) 님이 2017년 3월 29일 답변
0 추천

복잡하게 설명 주셨는데.. 

간단히  openssl heartbleed  보안 취약점 문제로 한번 뒤집어 진 이후 

보안을 강화시키면서  단말에 들어간 system library를 마쉬멜로부터는 사용 못하게 강제하고 있습니다.

안드로이드 소스에서 speex를 직접 빌드하던지

libspeex.so를 꺼내  libspeex_xxx.so 같은 이름으로 바꿔 같은 어플에 넣고 dlopen 하시면 됩니다.

익명사용자 님이 2017년 3월 29일 답변
2017년 3월 29일 수정
...