동적으로 클래스를 로드하는 문제에 대하여 질문드립니다.
몇일전 SDCARD에 Jar파일을 넣어서 어플에서 동적으로 Class를 로드하는 부분을 질문하였습니다.
기존에 자바같은 경우는 ClassLoader나 URLClassLoader를 사용하여 동적으로 Class를 로드하였습니다.
하지만 android에서는 위의 방법대로 할경우 에러가 발생하며
어떤분께서 친절하게 DexClassLoader를 사용하라고 답변을 주셨습니다.
제가 생각하는것이 맞다면
일단 java는 jvm을 사용하고 android는 dalvik을 사용합니다.
따라서 jvm같은 경우는 빌드가 된 class를 바로 사용이 가능하지만
dalvik에서는 런타임시 Dex로 변환이 되지 않은 class는 로딩이 불가능하다고 판단하였습니다
(이유는 필요한 클래스를 apk로 빌드하여 SDCARD에 넣고 사용할때는 정상적으로 아주 잘 동작을 하지만
jar형태로 export하여 SDCARD에 넣고 사용하면 예외가 발생합니다.)
제가 생각한 것이 맞나요?
말주변이 없어 제대로 설명을 한 것인지 모르겠습니다.
그래서 안드로이드에서 외부 jar에 class를 동적으로 로딩하려면
jar파일을 dex형태로 컨버팅해 놓아야 dalvik에서 class를 로딩이 가능한것 같습니다.
안드로이드 툴중에 dx 파일이 있는데
이것으로 jar파일을 dex형태로 컨버팅이 가능한가요?
아무리 해도 잘 되지 않습니다.
예) dx --dex --output=classes.dex mylib.jar
이와관련된 조언을 부탁드립니다.
댓글 감사합니다. 물론 저도 그방법은 사용하였습니다만 고객사측에서 원하는 것이 그게아니라...
하지만 해결했습니다.
dx --dex --output=변환후파일.jar(.dex상관없음) 변환할파일.jar(원본)
이렇게 해서 나온 결과물 jar파일을 SDCARD에 넣고 DexClassLoader를 사용하여 동적 클래스 로딩이 가능하더군요...
근데 찾다보니 3.x에선 지원하지 않고 Dalvik이 JVM의 특허를 침해했다고 오라클에서 소송중이라
향후 버전에서 지원계획이 불투명하다는 개소리를 본것같습니다...
그렇다면 이거 사용하면 나중에 피보는건 아닌지ㅠㅠ




음...가장 간단한게...
그냥 원하는 라이브러리가 포함된 빈 안드로이드 프로젝트를 생성하신 후, 그 apk 파일을 외부 디렉토리에 저장한 후 로드하는 방법이 있습니다.