2012-03-23 3 views
3

다음과 같은 상황을 고려하십시오 : P1과 P2라는 두 개의 안드로이드 프로젝트가 있는데 모두 동일한 프로세스 ID를 사용하며 동일한 프로세스에서 실행됩니다 안드로이드에. P1과 P2 모두 Java 라이브러리 JL1을 사용합니다. JL1은 런타임시 공유 라이브러리 1 SL1을로드합니다.안드로이드 빌드 시스템이 네이티브 공유 라이브러리를로드하는 자바 라이브러리를 처리하는 방법

런타임을 보면 SL1을로드하는 동안 어느 시점에서 java/lang/UnsatisfiedLinkError가 발생합니다. 또한 공유 lib가 이미 열려 있습니다.

이 문제의 원인은 무엇입니까? 나는 java에있는 라이브러리 코드가 모든 프로젝트/apk에서 복사되고 apk가 한 프로세스에서 병합되어 런타임에 복사본에 대해 잊어 버렸다고 가정합니다. 따라서 모든 사본은 공유 라이브러리 자체를로드하므로 이미로드 된 오류가 발생합니다.

그렇다면이 원치 않는 동작이 아닙니다. 왜냐하면 이제 한 번 이상 사용 된 동일한 프로세스에서 공유 라이브러리가있는 Java 라이브러리를 가질 수 없기 때문입니다.

[편집] 나는 모든 apk가 (동일한 과정에서) 자신의 클래스 로더를 사용한다는 것을 알았다. 즉, 모든 JL은 apk마다로드되는 클래스이므로 모든 공유 객체가 두 번 이상로드되어 오류가 발생합니다. 누군가이 아이디어를 어떻게 해결할 수 있을까요? apks가 클래스 로더를 공유하도록 할 수 있습니까?

+0

P1과 P2가 다른 클래스 로더에 의해로드되는 것처럼 보입니다. 그걸 확인해 줄 수 있니? 이것이 사실 인 경우 AFAIK이 예상되는 동작입니다. 즉, "동일한 JNI 기본 라이브러리를 두 개 이상의 클래스 로더에로드 할 수 없습니다." http://docs.oracle.com/javase/1.4.2/docs/guide/jni/jni-12.html 한 가지 해결 방법은 클래스 중 하나만 네이티브 메소드에 액세스해야하도록 클래스를 디자인하는 것입니다. –

+0

내가 알아야 할 것 같아. 나는 안드로이드가 이것을 어떻게 처리하는지 모른다. 나는 네가 숙련 된 것 같아. 질문에서 설명한대로. 동일한 프로세스에서로드되는 두 개의 다른 apk를 사용합니다. 안드로이드가 모든 apk에 대해 하나의 클래스 로더를 인스턴스화한다고 상상할 수 있습니다. 모든 프로세스에 대해 클래스 로더를 만드는 것이 더 좋을 것입니다. 안드로이드가 이것을 어떻게 처리하는지 찾아야합니다. – Bjorn

+0

나는 그것을 찾았다. 모든 apk에는 고유 한 클래스 로더가 있습니다. 이것은 공유 객체가 두 번로드된다는 것을 의미합니다. 이 문제를 해결할 수있는 아이디어가 있습니까? – Bjorn

답변

1

모든 apk에는 고유 한 클래스 로더가 있습니다. 즉, 두 개의 프로젝트/apk에는 라이브러리의 클래스 사본이 있습니다. 런타임시로드됩니다. 따라서 동일한 클래스처럼 보이는 것은 실제로 사본입니다. 따라서 이러한 클래스에서 네이티브 라이브러리를로드하면로드 된 모든 클래스에 대해로드됩니다 (정적 필드에서 완료된 경우에도 마찬가지 임). 두 apk가 동일한 프로세스를 공유하는 경우 네이티브 공유 객체를 두 번 이상로드하면 런타임 오류가 발생합니다.

관련 문제