2011-08-30 4 views
4

많은 양의 고유 코드가 여러 상호 의존 라이브러리로 포팅됩니다. Android 링커는 응용 프로그램 설치 디렉토리 /data/data/com.packagename.nnn/lib이 아닌 /system/lib/에서만 종속성을 표시하므로 코드로드가 실패합니다.Android에서 종속성이있는 공유 라이브러리로드

첫 번째 해결 방법으로 System.load() 을 사용하여 Java에서 모든 .so 파일을 올바르게 종속 순서으로로드했습니다. 이 솔루션은 플러그인 아키텍처로 인해 라이브러리 세트가 빌드에서 빌드로 변경되기 때문에 대부분 만족스럽지 않습니다. 또한 UI는 네이티브 라이브러리에 대해 많이 알 필요가 없습니다.

Android가 RPATH를 지원하지 않거나 앱의 LD_LIBRARY_PATH를 설정하지 않음을 발견했습니다. 유일한 해결책은 정규화 된 SONAME으로 라이브러리를 구축하는 것입니다.

그러나 일부 종속성은 사전 빌드되어 제공됩니다.

  1. 는 가능한이 .so를 정규화 SONAME이없는 필요한 경우에도 내 자신의 라이브러리로 정규화 필요한 태그를 컴파일인가?

  2. 또는 기존 .so를 수정하고 SONAME 또는 NEEDED를 다시 컴파일하지 않고 정규화 된 것으로 바꿀 수 있습니까?

+0

@ tasaarni 혹시 이것을 알아 냈습니까? 나는이 정확한 문제에 대해 DLL 지옥에있다. 내 공유 라이브러리 의존성은 많은 Android 기기에 포함되어있는 libicu에 따라 다르지만 일반적으로 필요한 기호가없는 이전 버전입니다. 그래서 특별히 필요한 의존성 순서로 필요한 라이브러리를로드하려고했습니다 ('ndk-depends'에 따라) - 새로운 libicu가 이런 식으로 ok를로드하는 것처럼 보입니다. 그렇지만 의존 라이브러리가 심볼을 찾을 수없는 것처럼 보입니다. 필요해. 실종 된 단계가 있습니까? – ephemer

답변

0

Mozilla Fennec은/data/data/package/디렉토리 아래에있는 사용자 정의 캐시 디렉토리에서 많은 공유 객체를로드하므로 소스를 살펴볼 수 있습니다.

+0

답변 해 주셔서 감사합니다! 로딩에 많은 노력을 들였음을 알았습니다. 그들은 심지어 자신의 수정 된 버전의 [링커] (http://hg.mozilla.org/mozilla-central/file/0664108eb19d/other-licenses/android/linker.c)를 구현했습니다! 그들은 경로 문제를 해결할 수 있었지만 나를 위해 그들은 여전히 ​​의존 관계의 하드 코드 된로드를 수행합니다 (http://hg.mozilla.org/mozilla-central/file/0664108eb19d/other-licenses/android/). APKOpen.cpp # l651). – tsaarni

관련 문제