2014-04-18 2 views
1

기본적으로 librtmp 컴파일은 librtmp.so.1 파일과 symlink librtmp.so을 생성합니다. andorid가 지원하지 않기 때문에 번호 접미사가없는 librtmp.so가 필요합니다. librtmp Makefile을 수정하여 버전 접미어를 제거하는 방법?

내가 librtmp.so 파일을 얻기 위해 Makefile을 수정 할 수 있었다 :

#SO_VERSION=1 
#SO_posix=.${SOX}.${SO_VERSION} 
SO_posix=${SOX} 

때문에 파일 생성 된 파일은 이제 librtmp.so

입니다하지만 여전히 librtmp.so.를로드하려고으로 안드로이드는 그것을로드 할 수 없습니다 (함께 도트)

Caused by: java.lang.UnsatisfiedLinkError: Cannot load library: link_image[1891]: 170 could not load needed library 'librtmp.so.' for 'libffmpeg.so' (load_library[1093]: Library 'librtmp.so.' not found) 

답변

2

공유 라이브러리의 foobar.so.56DT_SONAME 동적 태그 w 후 사정이 있으면 모자는 실제 파일을 호출합니다 (예 : foo.so 또는 libbar.so), 해당 라이브러리를 사용하여 실행 파일을 링크하면 SONAME이 실제 파일 이름이 아닌 실행 파일 (DT_NEEDED 동적 태그)에 기록됩니다.

librtmp.soDT_SONAMElibrtmp.so.입니다. 당신이 가진 것을 확인할 수 있습니다

readelf -d librtmp.so | grep SONAME 

그래서 당신이 SONAME 제거하려면 어떻게해야합니까? Makefile 어딘가에서 -Wl,--soname=...을 제거하십시오.

는 어떻게하면 SONAME 또는 파일 이름

를 사용하는 경우 실행 파일을 검사하는 실행 의지 항상 사용 SONAME (있는 경우). 수 실행 파일의 동적 섹션에서 DT_NEEDED 태그를 찾아 실행할 수있는 라이브러리를 확인할 수 있습니다.

readelf -d a.out | grep NEEDED 
+0

어떻게 SONAME 또는 파일 이름을 사용하면 실행 파일을 확인할 수 있습니까? – 4ntoine

+0

@ 4ntoine 답변을 업데이트했습니다. –

+0

Android NDK r9d에서이 간단한 트릭이 작동하지 않습니다. NDK는 DT_SONAME을 공유 라이브러리에 자동으로 추가합니다. 더 심한 경우, 실제로 열심히 노력하고이 필드를 제거하면 종속 공유 라이브러리에서 파일 이름이 여전히 ** 필요합니다 **. –

관련 문제